Excel高速导出

之前也写过很多次DataTable导出到Excel,用的基本上都是直接写单元格的形式:workSheet.Cells[x, y]=dt.Rows[i][j].ToString();

在数据量小的时候这种方法看不出问题,但数据量大的时候,弊端就很明显了。

我的数据量在2800行左右,这种导出方法用时在30秒左右。

经过一番折腾,终于找到了一个可以高速导出的方法。

关键部分就是:range.Value2 = objData;//objData是一个二维数组

代码
          // 创建Excel对象                  
            Excel.Application xlApp = new Excel.ApplicationClass();
            
if (xlApp == null)
            {
               strMsg
="Excel无法启动";
                
return false;
            }
            
// 创建Excel工作薄
            Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
            Excel.Worksheet xlSheet 
= (Excel.Worksheet)xlBook.Worksheets[1];

       Excel.Range range 
=null;
     

            
// 列索引,行索引,总列数,总行数
            int colIndex = 0;
            
int RowIndex = 0;
            
int colCount = tmpDataTable.Columns.Count;
            
int RowCount = tmpDataTable.Rows.Count;

            
// 创建缓存数据
            object[,] objData = new object[RowCount + 1, colCount];
            
// 获取列标题
            foreach (DataColumn dc in tmpDataTable.Columns)
            {
                objData[RowIndex, colIndex
++= dc.ColumnName;
            }
            
// 获取数据
            for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
            {
                
for (colIndex = 0; colIndex < colCount; colIndex++)
                {
                    objData[RowIndex, colIndex] 
= tmpDataTable.Rows[RowIndex - 1][colIndex].ToString();
                }
            }
            
// 写入Excel
            range= xlSheet.get_Range(xlApp.Cells[11], xlApp.Cells[RowCount, colCount]);
            range.Value2 
= objData;

            
// 保存
            try
            {
                xlBook.Saved 
= true;
                xlBook.SaveCopyAs(strFileName);
                xlApp.Quit();
                System.Diagnostics.Process.Start(
"Excel.exe", strFileName);
            }
            
catch(Exception ee)
            {
               strMsg
=ee.Message;
                
return false;
            }
            
finally
            {
                xlApp 
= null;
                GC.Collect();
            }

 

(这个方法是从CSDN上一位朋友共享的资料中得到的,具体地址没记住,还请作者见谅。)

 

采用这种方式再次导出,时间不到1秒。

 

posted @ 2010-09-06 18:06  中华  阅读(187)  评论(0)    收藏  举报