目前开发的一个系统需要将数据从数据库导出到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();
}