NPOI 強大之處在於支援「讀取」Excel 並理解 OLE2 文件結構,這也是其他庫的弱項。讀取並解析結構遠比產生複雜,因為讀取必須假設所有情況皆可能發生。若將讀取需求與產生需求視為兩個集合,產生需求通常是讀取需求的子集。此規律不僅適用 Excel,也適用 PDF 庫(多數僅支援產生)。
若不信 NPOI 解析能力,可下載 POIFS Browser 驗證。Excel 格式為 BIFF,建立在 OLE2 之上。NPOI 解析 BIFF 核心程式碼在 HSSF 命名空間。
HSSFWorkbookHSSFSheetHSSFRow(Excel 2003 上限 65535 列)HSSFCell(Excel 2003 上限 256 欄)遍歷單元格:HSSFSheet.GetRowEnumerator() 取得所有列;GetRow(rowIndex) 取特定列。邊界屬性:FirstRowNum、LastRowNum、FirstCellNum、LastCellNum。
開啟檔案流:
HSSFWorkbook hssfworkbook;
void InitializeWorkbook(string path) {
using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
hssfworkbook = new HSSFWorkbook(file);
}
核心轉換函數:
HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
for (int j = 0; j < 5; j++) dt.Columns.Add(((char)('A' + j)).ToString());
while (rows.MoveNext()) {
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++) {
HSSFCell cell = row.GetCell(i);
dr[i] = (cell == null) ? null : cell.ToString();
}
dt.Rows.Add(dr);
}
關鍵難點:Excel 儲存格型別多樣(布爾、數值、字串、公式、空白、錯誤)。NPOI 定義 HSSFCellType 列舉。注意:無日期型別,Excel 以數值+格式表示日期,NPOI 用 HSSFDataFormat 處理。使用 cell.ToString() 可統一取得顯示文字。
若需針對特定型別處理:
switch (cell.CellType) {
case HSSFCellType.BLANK: dr[i] = "[null]"; break;
case HSSFCellType.BOOLEAN: dr[i] = cell.BooleanCellValue; break;
case HSSFCellType.NUMERIC: dr[i] = cell.ToString(); break; // 正確取得日期或數值顯示
case HSSFCellType.STRING: dr[i] = cell.StringCellValue; break;
case HSSFCellType.ERROR: dr[i] = cell.ErrorCellValue; break;
case HSSFCellType.FORMULA: default: dr[i] = "=" + cell.CellFormula; break;
}
原文連結:NPOI 實戰原文