项目中需要将DataTable中的内容汇出到Excel文件中,采用循环的方式逐个Cell写数据到Excel文件中, 测试时发现很不好,汇出一个19列203行的Table时,用时竟然高达24秒多。【vs2017】
后来采用整体赋值的方法修改,代码如下:【已测试,正常运行】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
namespace MSExcel
{
public class TestZYClass2
{
//把数据表的内容导出到Excel文件中
public static void OutDataToExcel(System.Data.DataTable srcDataTable, string sheetName, string excelFilePath)
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
object objMissing = System.Reflection.Missing.Value;
//导出到execl
try
{
if (xlApp == null)
{
//MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel!");
return;
}
Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
if (sheetName == "")
{
// sheetName = "steet1";
return;
}
else
{
((Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1]).Name = sheetName;//将sheet1的名称改为sheetName值
}
Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];
object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];
//首先将数据写入到一个二维数组中
for (int i = 0; i < srcDataTable.Columns.Count; i++)
{
objData[0, i] = srcDataTable.Columns[i].ColumnName;
}
if (srcDataTable.Rows.Count > 0)
{
for (int i = 0; i < srcDataTable.Rows.Count; i++)
{
for (int j = 0; j < srcDataTable.Columns.Count; j++)
{
objData[i + 1, j] = srcDataTable.Rows[i][j];
}
}
}
string startCol = "A";
int iCnt = (srcDataTable.Columns.Count / 26);
string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();
Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());
range.Value = objData; //给Exccel中的Range整体赋值
// range.EntireColumn.AutoFit(); //设定Excel列宽度自适应
//xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
xlApp.Visible = false;
//设置禁止弹出保存和覆盖的询问提示框
xlApp.DisplayAlerts = false;
xlApp.AlertBeforeOverwriting = false;
xlBook.SaveAs(excelFilePath, objMissing, objMissing, objMissing, objMissing, objMissing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, objMissing, objMissing, objMissing, objMissing, objMissing);
xlBook.Close(false, Missing.Value, Missing.Value);
//退出并清理objects,回收内存
xlApp.Quit();
xlSheet = null;
xlBook = null;
xlApp = null;
GC.Collect();
}
catch (Exception ex)
{
throw ex;
}
}
//把数据表的内容导出到Excel文件中
public static void OutDataToExcel(System.Data.DataTable srcDataTable, string excelFilePath)
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
object objMissing = System.Reflection.Missing.Value;
//导出到execl
try
{
if (xlApp == null)
{
//MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel!");
return;
}
Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];
object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];
//首先将数据写入到一个二维数组中
for (int i = 0; i < srcDataTable.Columns.Count; i++)
{
objData[0, i] = srcDataTable.Columns[i].ColumnName;
}
if (srcDataTable.Rows.Count > 0)
{
for (int i = 0; i < srcDataTable.Rows.Count; i++)
{
for (int j = 0; j < srcDataTable.Columns.Count; j++)
{
objData[i + 1, j] = srcDataTable.Rows[i][j];
}
}
}
string startCol = "A";
int iCnt = (srcDataTable.Columns.Count / 26);
string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();
Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());
range.Value = objData; //给Exccel中的Range整体赋值
// range.EntireColumn.AutoFit(); //设定Excel列宽度自适应
//xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
xlApp.Visible = false;
//设置禁止弹出保存和覆盖的询问提示框
xlApp.DisplayAlerts = false;
xlApp.AlertBeforeOverwriting = false;
xlBook.SaveAs(excelFilePath, objMissing, objMissing, objMissing, objMissing, objMissing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, objMissing, objMissing, objMissing, objMissing, objMissing);
xlBook.Close(false, Missing.Value, Missing.Value);
//退出并清理objects,回收内存
xlApp.Quit();
xlSheet = null;
xlBook = null;
xlApp = null;
GC.Collect();
}
catch (Exception ex)
{
throw ex;
}
}
}
}