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) 不一致。Excel.tlb 類型程式庫遺失/損壞。NPOI** 是 Apache POI 的 .NET 移植版,**純 managed 程式碼**,**不需安裝 Excel**,支援 .xls (HSSF) 與 .xlsx (XSSF),效能更好、部署零依賴。
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);
}
}
Install-Package NPOI
| 項目 | Interop | NPOI |
|---|---|---|
| 需安裝 Excel | 是 | 否 |
| 伺服器部署 | 極難 (DCOM、權限) | 直接複製 DLL 即可 |
| 效能 | 慢 (跨進程 COM) | 快 (記憶體內操作) |
| 版本相依 | 高 | 無 |
| 功能完整度 | 100% Excel 功能 | 核心讀寫樣式公式皆支援 |
**結論**:除非需自動化操作 **開啟中的 Excel 視窗** (如巨集、列印預覽),**所有匯出/匯入場景均首選 NPOI**。