C# WinForm 导出Excel速度优化!

JJYY0088 2013-05-02 04:57:50
数据表有千万条数据,优化查询速度达到 2秒 (简单的查询),问题是导出Excel相当慢,大概2分钟左右,查询记录只有1000条也要这个时间,问问大家有没有好的解决方法,个人基本没有涉及过 winform开发!

导出excel方法(摘自网络):

protected void ExportExcel(SqlDataReader dr)
{
if (dr == null) return;
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = "Sheet1";
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
object missing = System.Reflection.Missing.Value;

if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
}
Workbooks workbooks = xlApp.Workbooks;
Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet1

int iRow = 0;
while (dr.Read())
{
for (int iCount = 0; iCount < dr.FieldCount; iCount++)
{
worksheet.Cells[iRow + 1, iCount + 1] = dr[iCount];
}

iRow++;
}

worksheet.SaveAs(saveFileName, XlFileFormat.xlTemplate, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);

workbook.Close(Type.Missing, Type.Missing, Type.Missing);
xlApp.Quit();

GC.Collect(); //回收资源
KillProcess("Excel"); //关闭进程
}


...全文
666 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
JJYY0088 2013-05-03
  • 打赏
  • 举报
回复
多谢大家解答。 下面的导出非常不错: http://bbs.csdn.net/topics/370085437
luckyccc 2013-05-03
  • 打赏
  • 举报
回复
每次read1次数据就初始化1次excel当然慢了
Justin-Liu 2013-05-03
  • 打赏
  • 举报
回复
简单的导出的话,把Excel作为一个数据库,用insert
lcawen 2013-05-03
  • 打赏
  • 举报
回复
Range r=worksheet.get_range("A1:C5"); r.value2=new object[3,5];//object[3,5]是一个二维数据,从SqlDataReader dr读值
lcawen 2013-05-03
  • 打赏
  • 举报
回复
Range有一个Value2属性,是一个object[,]数组,可以先定义一个区域,然后复制时Value2的值等于object[,]即可
  • 打赏
  • 举报
回复
把数据存到一个二维数据组里,然后再填充到EXCEL单元格区域....
niss 2013-05-02
  • 打赏
  • 举报
回复
个人认为还是aspose.cells最方便了
flashposition 2013-05-02
  • 打赏
  • 举报
回复
试试oledb连接excel然后select into怎么样?记得原来做过这样的
jimk5200 2013-05-02
  • 打赏
  • 举报
回复
首先可以肯定的是,你这种法子是最费时的,读一个字段,填一个单元格 你可以尝试以下方法: 1、读一行,之后直接COPY到EXCEL中 2、读N行,再COPY到EXCEL中 其中第2种法子,要看你一行有多少列,20列左右的话,读50行,再COPY到EXCEL中效率最高

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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