首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# DataGridView 匯出 Excel 遇到 COM 元件錯誤:改用 NPOI 完美解決

     編輯:程式設計綜合問答

錯誤訊息

System.InvalidCastException: 無法將類型為 "Microsoft.Office.Interop.Excel.ApplicationClass" 
的 COM 物件強制轉換為介面類型 "Microsoft.Office.Interop.Excel._Application"。
錯誤 HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)

原因分析

  • **版本不匹配**:專案參考的 Microsoft.Office.Interop.Excel (如 15.0 for Office 2013) 與電腦實際安裝的 Excel 版本、位數 (x86/x64) 不一致。
  • **註冊表/PIA 損毀**:Primary Interop Assembly 未正確註冊,或 Excel.tlb 類型程式庫遺失/損壞。
  • **權限問題**:ASP.NET/服務帳號無權存取 COM 元件 (DCOM 設定)。

根治方案:棄用 Interop,改用 NPOI

NPOI** 是 Apache POI 的 .NET 移植版,**純 managed 程式碼**,**不需安裝 Excel**,支援 .xls (HSSF) 與 .xlsx (XSSF),效能更好、部署零依賴。

NPOI 匯出完整範例

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; // .xlsx
using NPOI.HSSF.UserModel; // .xls
using System.IO;

public void ExportDataGridViewToExcel(DataGridView dgv, string filePath) {
    IWorkbook workbook = new XSSFWorkbook(); // 或 new HSSFWorkbook()
    ISheet sheet = workbook.CreateSheet("Sheet1");

    // 標題列
    IRow headerRow = sheet.CreateRow(0);
    for (int i = 0; i < dgv.Columns.Count; i++) {
        if (dgv.Columns[i].Visible) {
            headerRow.CreateCell(i).SetCellValue(dgv.Columns[i].HeaderText);
        }
    }

    // 資料列
    for (int r = 0; r < dgv.Rows.Count; r++) {
        if (dgv.Rows[r].IsNewRow) continue; // 跳過新增列
        IRow row = sheet.CreateRow(r + 1);
        int cellIdx = 0;
        for (int c = 0; c < dgv.Columns.Count; c++) {
            if (!dgv.Columns[c].Visible) continue;
            var val = dgv.Rows[r].Cells[c].Value;
            row.CreateCell(cellIdx++).SetCellValue(val?.ToString() ?? "");
        }
    }

    // 自動調整欄寬
    for (int i = 0; i < dgv.Columns.Count; i++) {
        if (dgv.Columns[i].Visible) sheet.AutoSizeColumn(i);
    }

    // 寫入檔案
    using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) {
        workbook.Write(fs);
    }
}

NuGet 安裝

Install-Package NPOI

優勢總結

項目InteropNPOI
需安裝 Excel是否
伺服器部署極難 (DCOM、權限)直接複製 DLL 即可
效能慢 (跨進程 COM)快 (記憶體內操作)
版本相依高無
功能完整度100% Excel 功能核心讀寫樣式公式皆支援

**結論**:除非需自動化操作 **開啟中的 Excel 視窗** (如巨集、列印預覽),**所有匯出/匯入場景均首選 NPOI**。

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