需讀取 Excel 文件將數據入庫 DB2,後續供報表查詢。功能簡單,選型 Apache POI(信任度高、社區活躍)。
public class POITest {
private static Connection conn;
private static Statement stmt;
// 1. DB2 連接(兩種驅動擇一)
private static boolean connectDB2() {
try {
// JCC 驅動 (推薦)
Class.forName("com.ibm.db2.jcc.DB2Driver");
String url = "jdbc:db2://192.168.0.1:50000/dbname";
// Legacy 驅動
// Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();
// String url = "jdbc:db2:njtcdata";
conn = DriverManager.getConnection(url, "username", "password");
stmt = conn.createStatement();
return true;
} catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); return false; }
}
// 2. POI 讀取 Excel → 逐行 INSERT
private static boolean readExcelToDB2() {
try (POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("c:\\test.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs)) {
HSSFSheet sheet = wb.getSheetAt(0);
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
HSSFRow row = sheet.getRow(i);
String name = row.getCell(0).getStringCellValue();
int id = (int) row.getCell(1).getNumericCellValue();
String sql = "INSERT INTO TEST(ID, NAME) VALUES(" + id + ",'" + name + "')";
stmt.executeUpdate(sql);
}
return true;
} catch (IOException | SQLException e) { e.printStackTrace(); return false; }
}
public static void main(String[] args) {
if (connectDB2() && readExcelToDB2()) System.out.println("導入成功");
else System.out.println("導入失敗");
}
}
interface RowMapper {
T mapRow(Row row, int rowNum) throws Exception;
}
interface SqlGenerator {
String generateInsert(T entity);
String generateBatchInsert(List entities); // 批次優化
}
class ExcelImportEngine {
void importExcel(File file, RowMapper mapper, SqlGenerator gen,
int batchSize, Connection conn) { ... }
}
| 配置項 | 說明 |
|---|---|
| sheet 選擇 | 名稱/索引/正則 |
| 表頭行號 | 自動偵測或指定 |
| 欄位映射 | Excel 欄名/索引 → 實體屬性 → DB 欄名 |
| 類型轉換 | String/Number/Date/Boolean 自定義轉換器 |
| 校驗規則 | 非空、長度、格式、外鍵存在性 |
| 目標表 | 單表/多表/臨時表+MERGE |
| 批次大小 | 預設 1000,可調 |
| 錯誤策略 | 跳過/終止/記錄錯誤行繼續 |
XSSFReader (SAX) 或 SXSSFWorkbook 處理大文件不 OOMLOAD FROM ...| 場景 | 推薦庫 | 理由 |
|---|---|---|
| .xls (BIFF8) | POI HSSF | 成熟穩定 |
| .xlsx (OOXML) | POI XSSF / SXSSF | 支援流式寫入大文件 |
| 超大文件/低記憶體 | EasyExcel (阿里) | 佔用記憶體極低、API 友好 |
| 純讀取/高性能 | fastexcel | 零依賴、極快 |
Demo 走通「連接 → 讀取 → 寫入」最短路徑;通用轉換器將「映射、校驗、批次、錯誤處理、效能」外部化配置,實現一套引擎跑遍所有 Excel 導入場景。下一步:抽取配置 Schema、實現映射 DSL、接入監控告警,沉澱為組件庫服務全團隊。