提供的程式碼僅包含檔案選擇器 `importTableChooser`,核心邏輯 `importTable()` 為空,且缺少任何 Excel 解析與資料庫寫入程式碼。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
public List parseExcel(File file) throws IOException {
List users = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(file);
Workbook wb = WorkbookFactory.create(fis)) { // 自動識別 xls/xlsx
Sheet sheet = wb.getSheetAt(0);
for (int i = 1; i <= sheet.getLastRowNum(); i++) { // 跳過標題行
Row row = sheet.getRow(i);
if (row == null) continue;
User u = new User();
u.setName(getCellString(row.getCell(0)));
u.setAge((int) row.getCell(1).getNumericCellValue());
u.setEmail(getCellString(row.getCell(2)));
users.add(u);
}
}
return users;
}
private String getCellString(Cell cell) {
if (cell == null) return "";
return switch (cell.getCellType()) {
case STRING -> cell.getStringCellValue();
case NUMERIC -> String.valueOf((long) cell.getNumericCellValue());
case BOOLEAN -> String.valueOf(cell.getBooleanCellValue());
default -> "";
};
}
public void batchInsert(List users) throws SQLException {
String sql = "INSERT INTO t_user(name, age, email) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false);
for (User u : users) {
ps.setString(1, u.getName());
ps.setInt(2, u.getAge());
ps.setString(3, u.getEmail());
ps.addBatch();
// 每 1000 條提交一次,避免記憶體飆升
if (users.indexOf(u) % 1000 == 0) ps.executeBatch();
}
ps.executeBatch(); // 剩餘
conn.commit();
}
}
public void approveSelection() {
File file = getSelectedFile();
if (file.isDirectory()) {
file = new File(file, db.getDatabaseName() + ".xlsx");
}
if (file.exists()) {
try {
List list = parseExcel(file);
batchInsert(list);
JOptionPane.showMessageDialog(mainFrame, "導入成功:" + list.size() + " 筆");
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(mainFrame, "導入失敗:" + ex.getMessage());
}
}
super.approveSelection();
}
「選檔 → POI 解析 → 批次 JDBC 入庫」三步走,核心在於 **流式讀取 + 批次提交**,即可穩定高效完成 Excel 導入 MySQL。