读取数据并创建Excel文件的效率低下

SkyIsland 2009-07-29 08:41:20

private static void DownloadFile(System.Web.UI.Page page, string targetFile)
{
FileInfo DownloadFile = new FileInfo(targetFile);

page.Response.Clear();
page.Response.ClearHeaders();
page.Response.Buffer = false;
page.Response.ContentType = "application/octet-stream";
page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
page.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
page.Response.WriteFile(DownloadFile.FullName);
page.Response.Flush();
page.Response.End();
}

private static void ToExcel(System.Web.UI.Page page, System.Data.DataTable dataSource)
{
string targetFile = ConfigurationManager.AppSettings["Exportfile"].ToString();
if (File.Exists(targetFile))
{
File.Delete(targetFile);
}

ApplicationClass xlApp = new ApplicationClass();

xlApp.Application.Workbooks.Add(true);

xlApp.Visible = false;

object missing = System.Reflection.Missing.Value;

Workbook xlBook = xlApp.Workbooks[1];
Worksheet xlSheet = (Worksheet)xlBook.ActiveSheet;

//设置标题列
for (int i = 0; i < dataSource.Columns.Count; i++)
{
xlSheet.Cells[1, i + 1] = dataSource.Columns[i].ColumnName;
}


//向Excel插入数据
for (int i = 0; i < dataSource.Rows.Count; i++)
{
for (int j = 0; j < dataSource.Columns.Count; j++)
{
xlSheet.Cells[i + 2, j + 1] = dataSource.Rows[i][j].ToString();
xlSheet.get_Range(xlSheet.Cells[1, j + 1], xlSheet.Cells[1, j + 1]).Borders.LineStyle = 1;
xlSheet.get_Range(xlSheet.Cells[i + 2, j + 1], xlSheet.Cells[i + 1, j + 1]).Borders.LineStyle = 1;
}
}

//设置Excel单元格为最适应宽度
xlSheet.get_Range(xlSheet.Cells[1, 1], xlSheet.Cells[dataSource.Rows.Count, dataSource.Columns.Count]).Select();
xlSheet.get_Range(xlSheet.Cells[1, 1], xlSheet.Cells[dataSource.Rows.Count, dataSource.Columns.Count]).Columns.AutoFit();

//另存文件到指定路径下
xlBook.SaveAs(targetFile, missing, missing, missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
//关闭文件
xlBook.Close(false, targetFile, true);
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

//强制释放无用资源
GC.Collect();
DownloadFile(page, targetFile);
}

用以上代码读数据后创建Excel文件,然后下载文件,效率非常低,5行数据要等10—15秒,700行数据居然等了40分钟。(读数据的效率没问题,700行数据读出来保存到DataTable只是一瞬间)
...全文
49 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2009-08-03
  • 打赏
  • 举报
回复
去搜索“excel ado.net” 和"Excel Web Service"
SkyIsland 2009-08-02
  • 打赏
  • 举报
回复
楼上的,具体是什么意思?
蒋晟 2009-08-02
  • 打赏
  • 举报
回复
用Excel的ODBC或者OLEDB驱动吧,Excel Web Service也行
zmbysj 2009-07-29
  • 打赏
  • 举报
回复
顶楼上的!
cpp2017 2009-07-29
  • 打赏
  • 举报
回复
sorry上面的(4楼)发错了.
cpp2017 2009-07-29
  • 打赏
  • 举报
回复
public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
{
//base.VerifyRenderingInServerForm(control);
}

这个放在页面中
cpp2017 2009-07-29
  • 打赏
  • 举报
回复
没有GridView,直接拼出一个table也可导出
SkyIsland 2009-07-29
  • 打赏
  • 举报
回复
没有GridView,我们这个项目不允许使用服务器控件,前台是标准DHTML。

那我试试用数据库直接导。
IHandler 2009-07-29
  • 打赏
  • 举报
回复
这样写是单元格一个一个得写入
尝试:
先把数据读取出来绑定到GridView,然后直接导出GridView,效率相对高

另外Sql Server数据库可以直接调用存储过程导出Excel

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧