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

資料匯入匯出 Excel 完整方案總結:NPOI、COM、OleDb、OpenXML、EPPlus、CSV 十大方案比較

     編輯:關於.NET

專案常需「資料→Excel」與「Excel→資料庫」雙向操作,本文總結十大主流方案優缺點、適用場景、核心代碼片段,協助技術選型。

方案比較總表

方案優點缺點適用場景相依性
NPOI免費開源、無需 Office、支援 .xls/.xlsx/.docx、功能完整 (樣式/公式/圖表)、串流式讀寫大檔案記憶體佔用高、API 複雜伺服器端匯入匯出、跨平台、無 Office 環境NPOI.dll + SharpZipLib
COM Interop完整 Excel 物件模型、支援所有 UI 操作 (宏/圖表/樞紐分析)需安裝 Office、效能極差、佔用高、伺服器不穩定、版本相容性差桌面端自動化、需複雜 UI 操作、舊系統維護Microsoft.Office.Interop.Excel
OleDb (ACE/Jet)SQL 語法查詢/寫入、無需 Office、支援 .xls/.xlsx型別推斷易錯 (首 8 列決定)、無法操作樣式/公式、64 位元需 ACE Provider簡單表格資料匯入匯出、類資料庫操作System.Data.OleDb + ACE Provider
XML (Excel 2003 XML)純文字、易產生/解析、無相依僅支援舊版 XML 格式、無樣式/公式、大檔案效能差極簡匯出、舊系統相容System.Xml
js 前端匯出 (DataTables/TableTools)零後端壓力、用戶端直接下載、支援多格式大量資料瀏覽器卡頓、受限於記憶體、無法處理敏感資料前端導出、報表下載、資料量 < 1 萬列DataTables.js + Buttons.js
CSV極簡、通用、無相依、串流處理、支援超大檔無樣式/多工作表/公式、編碼易亂碼、無型別資料交換、ETL 中繼、日誌匯出、大數據System.IO
Aspose.Cells功能最強 (渲染/轉 PDF/圖表/樞紐)、無需 Office、效能佳商業授權昂貴、體積大企業級報表、複雜樣式、PDF 轉換、預算充足Aspose.Cells.dll
OpenXML SDK微軟官方、底層控制最細、無需 Office、支援 .xlsx/.docx/.pptx學習曲線極陡、代碼冗長、需懂 OOXML 結構深度定制、高效能串流、文件結構操作DocumentFormat.OpenXml.dll
EPPlusAPI 友善、支援 .xlsx、效能好、功能豐富 (樣式/公式/圖表/資料驗證)v5+ 改為商業授權 (Polyform Noncommercial)、v4 免費但無維護.xlsx 現代專案、團隊熟悉 EPPlus APIEPPlus.dll
模板填充設計與代碼分離、美工維護樣板、代碼只填資料需額外模板引擎 (NPOI/EPPlus/OpenXML 皆可)固定格式報表、複雜排版、非技術人員維護樣式視底層庫而定

核心代碼片段精選

NPOI 匯出 DataTable → .xlsx

public static byte[] ExportDataTable(DataTable dt, string sheetName)
{
    using (var workbook = new XSSFWorkbook())
    {
        var sheet = workbook.CreateSheet(sheetName);
        // 標題列
        var headerRow = sheet.CreateRow(0);
        for (int c = 0; c < dt.Columns.Count; c++)
            headerRow.CreateCell(c).SetCellValue(dt.Columns[c].ColumnName);
        // 資料列
        for (int r = 0; r < dt.Rows.Count; r++)
        {
            var row = sheet.CreateRow(r + 1);
            for (int c = 0; c < dt.Columns.Count; c++)
                row.CreateCell(c).SetCellValue(dt.Rows[r][c]?.ToString() ?? "");
        }
        using (var ms = new MemoryStream())
        {
            workbook.Write(ms);
            return ms.ToArray();
        }
    }
}

OleDb 匯入 Excel → DataTable

public static DataTable ImportExcel(string filePath, string sheetName)
{
    string connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
    using (var conn = new OleDbConnection(connStr))
    {
        conn.Open();
        using (var cmd = new OleDbCommand($"SELECT * FROM [{sheetName}$]", conn))
        using (var adapter = new OleDbDataAdapter(cmd))
        {
            var dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }
    }
}

CSV 匯出 (串流式、大檔案適用)

public static void ExportCsv(DataTable dt, Stream output, Encoding encoding = null)
{
    encoding = encoding ?? Encoding.UTF8;
    using (var writer = new StreamWriter(output, encoding))
    {
        // 標題
        writer.WriteLine(string.Join(",", dt.Columns.Cast().Select(c => EscapeCsv(c.ColumnName))));
        // 資料
        foreach (DataRow row in dt.Rows)
        {
            writer.WriteLine(string.Join(",", row.ItemArray.Select(v => EscapeCsv(v?.ToString() ?? ""))));
        }
    }
}
static string EscapeCsv(string s) => s.Contains(",") || s.Contains("\"") || s.Contains("\n") 
    ? "\"" + s.Replace("\"", "\"\"") + "\"" : s;

EPPlus 範本填充

// 模板檔案預留 {Name}、{Date} 等標記或具名範圍
using (var pkg = new ExcelPackage(new FileInfo("Template.xlsx")))
{
    var ws = pkg.Workbook.Worksheets[0];
    ws.Cells["NamedRange_Name"].Value = "John Doe";
    ws.Cells["NamedRange_Date"].Value = DateTime.Today;
    pkg.SaveAs(new FileInfo("Output.xlsx"));
}

選型決策樹

  1. **伺服器端、無 Office、免費、.xls/.xlsx 皆需** → **NPOI** (首選)
  2. **僅 .xlsx、現代 API、團隊習慣 EPPlus** → **EPPlus v4** (免費) 或購買 v5+ 授權
  3. **極大檔案、串流處理、無樣式需求** → **CSV** 或 **OpenXML SDK (SAX 模式)**
  4. **需完美渲染/轉 PDF/圖表、預算充足** → **Aspose.Cells**
  5. **桌面端自動化、需巨集/樞紐/圖表操作** → **COM Interop** (僅限客戶端)
  6. **前端導出、資料量小** → **DataTables + Buttons**
  7. **固定格式報表、美工維護樣式** → **模板填充** (底層用 NPOI/EPPlus)

避坑指南

  • OleDb `IMEX=1` 強制文字模式,避免混合型別讀空
  • NPOI/EPPlus 大量寫入時**關閉自動計算公式** (`workbook.ForceFormulaRecalculation = false`)
  • CSV 匯出**指定 UTF-8 with BOM** (`new UTF8Encoding(true)`) 相容 Excel 開啟不亂碼
  • COM Interop **務必釋放 COM 物件** (`Marshal.ReleaseComObject`),否則殘留 Excel 進程
  • OpenXML SDK 操作 `SharedStringTable`、 `Stylesheet` 等底層部件需深入理解 ECMA-376 標準

沒有完美方案,只有最適合當前約束的方案。**NPOI 綜合性價比最高**,建議作為預設選擇,特定場景再引入專用庫。

資源下載

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