商務使用者習慣用 Excel 進行資料輸入、操作與分析,但 Excel 缺乏大量資料分發、頻繁更新、多用戶並存取等企業級能力。DB2 擅長這些領域。若能結合「商務專家的 Excel 技能」與「關聯資料庫的分散式優勢」,將極大提升組織生產力。Apache POI 專案的 HSSF 元件(Horrible Spreadsheet Format)提供 Java API 讀寫 Excel 97-2002 格式,搭配 JDBC 即可構建免費、可攜、彈性的 Excel-to-DB2 整合方案。
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,配合進度條回饋。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 寫法供參考。
讀取第一列作為欄名,第二非空列判斷資料型別(CELL_TYPE_NUMERIC、STRING、FORMULA、BLANK),免除人工猜測。
// 動態產生 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 提升效能。
db2cc) 開啟新建表,資料與 Excel 完全一致。本文示範以 POI/HSSF + JDBC 實現 Excel 資料自動化載入 DB2,原始碼開放可依組織需求客製化。HSSF 亦支援格式、樣式、公式等進階功能,若需反向匯出(DB2 → Excel)可參考姊妹篇。對於零成本、Java 技術棧、需深度整合的專案,POI/HSSF 是極佳選擇。