項目中需要將DataTable中的內容匯出到Excel文件中,採用循環的方式逐個Cell寫數據到Excel文件中,代碼如下:
//把數據表的內容導出到Excel文件中
public static void OutDataToExcel2(System.Data.DataTable srcDataTable, string excelFilePath)
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
object missing = 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];
//讓後臺執行設置爲不可見,爲true的話會看到打開一個Excel,然後數據在往裏寫
xlApp.Visible = false;
//生成Excel中列頭名稱
for (int i = 0; i < srcDataTable.Columns.Count; i++)
{
xlSheet.Cells[1, i + 1] = srcDataTable.Columns[i].ColumnName;//輸出DataGridView列頭名
}
//把DataGridView當前頁的數據保存在Excel中
if (srcDataTable.Rows.Count > 0)
{
for (int i = 0; i < srcDataTable.Rows.Count; i++)//控制Excel中行
{
for (int j = 0; j < srcDataTable.Columns.Count; j++)//控制Excel中列
{
xlSheet.Cells[i + 2, j + 1] = srcDataTable.Rows[i][j];//i控制行,從Excel中第2行開始輸出第一行數據,j控制列,從Excel中第1列輸出第1列數據
}
}
}
//設置禁止彈出保存和覆蓋的詢問提示框
xlApp.DisplayAlerts = false;
xlApp.AlertBeforeOverwriting = false;
if (xlSheet != null)
{
xlSheet.SaveAs(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing);
KillProcess(xlApp);
}
}
catch (Exception ex)
{
KillProcess(xlApp);
throw ex;
}
}
測試時發現很不好,匯出一個19列203行的Table時,用時竟然高達24秒多。
後來採用整體賦值的方法修改,代碼如下:
//把數據表的內容導出到Excel文件中
public static void OutDataToExcel(System.Data.DataTable srcDataTable, string excelFilePath)
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
object missing = 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];
//讓後臺執行設置爲不可見,爲true的話會看到打開一個Excel,然後數據在往裏寫
xlApp.Visible = false;
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
//設置禁止彈出保存和覆蓋的詢問提示框
xlApp.DisplayAlerts = false;
xlApp.AlertBeforeOverwriting = false;
if (xlSheet != null)
{
xlSheet.SaveAs(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing);
//xlApp.Quit();
KillProcess(xlApp);
}
}
catch (Exception ex)
{
KillProcess(xlApp);
throw ex;
}
}
測試之前的19列203行的DataTable,用時爲4秒多一些。