針對大數據量導出場景,摒棄逐行寫入,利用 Excel 內建的 QueryTable 功能,通過 OLEDB 直連數據庫,將查詢結果直接填充到工作表,速度提升數量級。需引用 Microsoft.Office.Interop.Excel COM 組件。
using Excel = Microsoft.Office.Interop.Excel;
static void ExportDataToExcel(string connStr, string sql, string fileName, string sheetName)
{
var app = new Excel.ApplicationClass();
var wb = (Excel.WorkbookClass)app.Workbooks.Add(Type.Missing);
var ws = wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing) as Excel.Worksheet;
ws.Name = sheetName;
try
{
var qt = ws.QueryTables.Add("OLEDB;" + connStr, ws.get_Range("A1", Type.Missing), sql);
qt.Refresh(false); // false = 同步查詢,阻塞直到完成
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
wb.Saved = true;
wb.SaveCopyAs(fileName);
app.Quit(); // 必須退出進程,否則 Excel 殭屍進程駐留
}
}
// 調用示例
ExportDataToExcel(
"Provider=SQLOLEDB.1;Server=localhost;Uid=sa;Pwd=***;Database=master;",
"SELECT * FROM sysobjects",
@"c:\testOle.xls",
"sysobjects");
true) 需處理 AfterRefresh 事件。app.Quit() 至關重要,配合 Marshal.ReleaseComObject 循環釋放所有 COM 對象,防止內存洩漏。10 萬行 × 20 列:逐行寫入 ~120秒,QueryTable ~8秒(含查詢時間)。