首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 高性能導出 Excel:QueryTable 直接從數據庫填充工作表

     編輯:關於C#

針對大數據量導出場景,摒棄逐行寫入,利用 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");

關鍵點解析

  1. 連接字符串:標準 OLEDB 格式,支持 SQL Server、Oracle、Access、MySQL 等任意數據源。
  2. QueryTable.Add:參數依次為連接字符串(含 "OLEDB;" 前綴)、目標範圍(從 A1 開始)、SQL 查詢語句。
  3. Refresh(false):同步模式確保導出完成再繼續;異步模式 (true) 需處理 AfterRefresh 事件。
  4. 資源釋放:app.Quit() 至關重要,配合 Marshal.ReleaseComObject 循環釋放所有 COM 對象,防止內存洩漏。

適用場景與限制

  • ✅ 適用:數萬~百萬行數據導出、服務端定時任務、複雜 SQL 直出報表。
  • ❌ 不適用:需精細控制單元格樣式、合併、公式、圖表等高級排版(需回退 NPOI/EPPlus/OpenXML)。
  • ⚠️ 環境要求:運行機器需安裝 Excel(或至少安裝 Excel 查看器/PIA),且位數(32/64位)與應用程序池一致。

性能對比參考

10 萬行 × 20 列:逐行寫入 ~120秒,QueryTable ~8秒(含查詢時間)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved