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

NPOI 實戰:.NET 讀取 Excel 的另一選擇

     編輯:關於.NET

NPOI 強大之處在於支援「讀取」Excel 並理解 OLE2 文件結構,這也是其他庫的弱項。讀取並解析結構遠比產生複雜,因為讀取必須假設所有情況皆可能發生。若將讀取需求與產生需求視為兩個集合,產生需求通常是讀取需求的子集。此規律不僅適用 Excel,也適用 PDF 庫(多數僅支援產生)。

若不信 NPOI 解析能力,可下載 POIFS Browser 驗證。Excel 格式為 BIFF,建立在 OLE2 之上。NPOI 解析 BIFF 核心程式碼在 HSSF 命名空間。

基礎知識

  • 每個 .xls 對應唯一 HSSFWorkbook
  • Workbook 包含多個 HSSFSheet
  • Sheet 包含多個 HSSFRow(Excel 2003 上限 65535 列)
  • Row 包含多個 HSSFCell(Excel 2003 上限 256 欄)

遍歷單元格:HSSFSheet.GetRowEnumerator() 取得所有列;GetRow(rowIndex) 取特定列。邊界屬性:FirstRowNum、LastRowNum、FirstCellNum、LastCellNum。

讀取 Excel 至 DataTable

開啟檔案流:

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 實戰原文

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