目前開發的一個系統需要將數據從數據庫導出到Excel.
之前一直在用
將GridView源代碼輸出的方式,但是今天發現這種方式輸出的XLS文件,在用Excel打開的時候會有一個提示“您嘗試打開的文件XXX的格式與文件指定擴展名不一致。。。。是否打開”。
于是決心換一種方式導出。
在園子里看到一些人使用Microsoft.Office.Interop.Excel來完成的。但是實際試了一下,每分鐘大概能導出7-800條。速度實在是受不了。
于是使用了拼接csv文件的方式,csv文件可以用Excel正常打開,沒有任何影響,而且可以轉存成xls格式。
另外,以下代碼的","(逗號) 換成“\t”就是標準的xls文件格式。
public void SetExcelFromData(System.Data.DataTable dt, string FileName)
{
StringWriter sw = new StringWriter();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < dt.Columns.Count; i++)
{
sb.Append(dt.Columns[i].ColumnName);
if (i != dt.Columns.Count - 1)
{
sb.Append(",");
}
}
sw.WriteLine(sb.ToString());
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count;i++ )
{
sw.Write(dr[i]);
if(i!=dt.Columns.Count-1)
{
sw.Write(",");
}
}
sw.WriteLine("");
}
sw.Close();
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + Context.Server.UrlEncode(FileName) + ".csv");
Response.ContentType = "application/ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
Response.Write(sw);
Response.End();
}
{
StringWriter sw = new StringWriter();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < dt.Columns.Count; i++)
{
sb.Append(dt.Columns[i].ColumnName);
if (i != dt.Columns.Count - 1)
{
sb.Append(",");
}
}
sw.WriteLine(sb.ToString());
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count;i++ )
{
sw.Write(dr[i]);
if(i!=dt.Columns.Count-1)
{
sw.Write(",");
}
}
sw.WriteLine("");
}
sw.Close();
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + Context.Server.UrlEncode(FileName) + ".csv");
Response.ContentType = "application/ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
Response.Write(sw);
Response.End();
}
浙公網安備 33010602011771號