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

Java 實戰:使用 Apache POI 讀取 Excel 並批量導入 DB2 資料庫

     編輯:DB2 教學

技術選型:為什麼選 POI?

專案需求單純:讀取 Excel → 寫入 DB2 → 報表展示。對比 JXL、POI 等方案,POI 出身 Apache、社群活躍、支援 .xls/.xlsx、API 成熟,最終選定 POI 3.x(HSSF/XSSF)。

核心依賴

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.17</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.17</version>
</dependency>
<!-- DB2 JDBC Type 4 驅動 -->
<dependency>
  <groupId>com.ibm.db2</groupId>
  <artifactId>db2jcc4</artifactId>
  <version>10.5</version>
</dependency>

完整範例程式碼(含註解優化版)

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelToDB2Importer {

    private static final String JDBC_URL = "jdbc:db2://192.168.0.1:50000/DBNAME";
    private static final String USER = "username";
    private static final String PASS = "password";
    private static final String EXCEL_PATH = "c:/test.xlsx";
    private static final String INSERT_SQL = "INSERT INTO TEST (ID, NAME) VALUES (?, ?)";

    public static void main(String[] args) {
        try (Connection conn = getConnection();
             PreparedStatement ps = conn.prepareStatement(INSERT_SQL);
             FileInputStream fis = new FileInputStream(EXCEL_PATH);
             Workbook wb = WorkbookFactory.create(fis)) {

            Sheet sheet = wb.getSheetAt(0);
            conn.setAutoCommit(false);  // 批量提交

            for (Row row : sheet) {
                if (row.getRowNum() == 0) continue; // 跳過標題列

                Cell idCell = row.getCell(0);
                Cell nameCell = row.getCell(1);
                if (idCell == null || nameCell == null) continue;

                int id = (int) idCell.getNumericCellValue();
                String name = nameCell.getStringCellValue();

                ps.setInt(1, id);
                ps.setString(2, name);
                ps.addBatch();

                // 每 1000 條提交一次,避免日誌暴漲
                if (row.getRowNum() % 1000 == 0) {
                    ps.executeBatch();
                    conn.commit();
                }
            }
            ps.executeBatch(); // 餘數提交
            conn.commit();
            System.out.println("資料導入成功");

        } catch (IOException | SQLException e) {
            e.printStackTrace();
            System.err.println("導入失敗:" + e.getMessage());
        }
    }

    private static Connection getConnection() throws SQLException {
        try {
            Class.forName("com.ibm.db2.jcc.DB2Driver"); // Type 4 純 Java 驅動
        } catch (ClassNotFoundException e) {
            throw new SQLException("找不到 DB2 JDBC 驅動", e);
        }
        return DriverManager.getConnection(JDBC_URL, USER, PASS);
    }
}

關鍵優化點解析

  1. PreparedStatement + Batch:防 SQL 注入、減少網路往返、提升吞吐量。
  2. 關閉 AutoCommit + 定期 Commit:每 1000 條提交一次,平衡日誌空間與恢復點。
  3. WorkbookFactory.create():自動識別 .xls/.xlsx,無需手動區分 HSSF/XSSF。
  4. Type 4 驅動:com.ibm.db2.jcc.DB2Driver 純 Java、無需 Client 安裝、跨平台部署最簡單。
  5. 資源自動關閉:try-with-resources 確保連線、流、Statement 正確釋放。

常見問題排查

  • ClassNotFoundException:確認 db2jcc4.jar 在 Classpath。
  • 中文亂碼:確保資料庫/表/連線編碼一致(建議 UTF-8),JVM 參數 -Dfile.encoding=UTF-8。
  • 大數值導入科學計數法:NumericCellValue 取得 double,轉 long 或 BigDecimal 處理。
  • 日期儲存格:用 DateUtil.isCellDateFormatted(cell) 判斷,再 getDateCellValue()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved