首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

使用 Apache POI 與 HSSF 將 Excel 試算表資料載入 DB2

     編輯:DB2 教學

前言:跨越 Excel 與 DB2 的鴻溝

商務使用者習慣用 Excel 進行資料輸入、操作與分析,但 Excel 缺乏大量資料分發、頻繁更新、多用戶並存取等企業級能力。DB2 擅長這些領域。若能結合「商務專家的 Excel 技能」與「關聯資料庫的分散式優勢」,將極大提升組織生產力。Apache POI 專案的 HSSF 元件(Horrible Spreadsheet Format)提供 Java API 讀寫 Excel 97-2002 格式,搭配 JDBC 即可構建免費、可攜、彈性的 Excel-to-DB2 整合方案。

為什麼選擇 POI/HSSF?

Microsoft 專有格式難以互操作,POI(Poor Obfuscation Implementation)以開放原始碼解決此痛點。HSSF 專門處理 BIFF 格式(.xls),功能涵蓋儲存格讀寫、格式控制、中繼資料操作。雖 IBM 推出功能更豐富的 DB2 Office Connect,但 POI/HSSF 適合需深度客製化、零授權成本、Java 生態系整合的場景。

應用程式架構與流程

範例應用為 Swing GUI 程式,核心類別:

  • LoginDialog/LoginService:資料庫認證連線。
  • SQLFacade:封裝 JDBC 操作,隔離 SQL 細節。
  • SpreadsheetTableModel:使用 HSSF 讀取 Excel,建立記憶體表模型(含欄名、型別、資料列)。
  • DBTableGenerator:背景執行緒建立目標表並批次 INSERT,配合進度條回饋。

關鍵程式碼解析

1. 使用 HSSF 讀取 Excel(SpreadsheetTableModel.reloadSpreadsheetModel)

HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(fileName));
String tableName = wb.getSheetName(0);           // 取第一個工作表名為表名
HSSFSheet sheet = wb.getSheet(tableName);

int rowCount = sheet.getPhysicalNumberOfRows();
int colCount = sheet.getRow(0).getPhysicalNumberOfCells();

List<List<HSSFCell>> result = new ArrayList<>();
for (int i = 1; i < rowCount; i++) {             // 跳過標題列
    HSSFRow row = sheet.getRow(i);
    List<HSSFCell> rowData = new ArrayList<>();
    for (short j = 0; j < colCount; j++) {
        rowData.add(row.getCell(j));
    }
    result.add(rowData);
}
rowCount--;  // 扣除標題列

巢狀迴圈逐列逐儲存格掃描,利用 getRow/getCell 存取器將資料載入記憶體 List<List<HSSFCell>>。另提供 reloadSpreadsheetModelAlternate 使用 Iterator 寫法供參考。

2. 自動推導欄位名稱與型別(updateColumnModel)

讀取第一列作為欄名,第二非空列判斷資料型別(CELL_TYPE_NUMERIC、STRING、FORMULA、BLANK),免除人工猜測。

3. 動態建表與批次寫入(DBTableGenerator.run)

// 動態產生 CREATE TABLE
String sqlCreate = "CREATE TABLE " + user + "." + tableName + " ( ";
for (int c = 0; c < colCount-1; c++) {           // 排除第一欄行號
    if (c > 0) sqlCreate += ", ";
    sqlCreate += colNames.get(c) + " ";
    switch (colTypes.get(c)) {
        case HSSFCell.CELL_TYPE_NUMERIC: sqlCreate += "FLOAT"; break;
        case HSSFCell.CELL_TYPE_STRING:
        case HSSFCell.CELL_TYPE_FORMULA:
        case HSSFCell.CELL_TYPE_BLANK:   sqlCreate += "CHARACTER(100)"; break;
        default: throw new SQLException();
    }
}
sqlCreate += " ); ";
sqlFacade.executeUpdate(sqlCreate);

// 逐列 INSERT
for (int r = 0; r < rowCount; r++) {
    String sqlInsert = "INSERT INTO " + user + "." + tableName + " (cols) VALUES (";
    for (int c = 0; c < colCount-1; c++) {
        if (c > 0) sqlInsert += ", ";
        sqlInsert += "'" + ((HSSFCell)model.getRow(r).get(c)).getStringCellValue() + "'";
    }
    sqlInsert += "); ";
    sqlFacade.executeUpdate(sqlInsert);
}

為簡化示範,數值型統一映射為 FLOAT,字串型映射 CHAR(100)。實際專案可依業務需求精細映射。採單列 INSERT 而非批次,旨在清晰展示 HSSF 與 JDBC 串接流程;生產環境建議改用 PreparedStatement + addBatch 提升效能。

執行畫面與驗證

  1. 啟動程式 → 輸入 DB2 連線資訊認證。
  2. 選擇 .xls 檔案 → 預覽表結構(欄名、型別、前幾列資料),表名預設取工作表名,可修改。
  3. 點擊 Write DB Table → 進度條顯示建表與寫入進度。
  4. 完成後,用 DB2 Control Center (db2cc) 開啟新建表,資料與 Excel 完全一致。

總結與延伸

本文示範以 POI/HSSF + JDBC 實現 Excel 資料自動化載入 DB2,原始碼開放可依組織需求客製化。HSSF 亦支援格式、樣式、公式等進階功能,若需反向匯出(DB2 → Excel)可參考姊妹篇。對於零成本、Java 技術棧、需深度整合的專案,POI/HSSF 是極佳選擇。

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