<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
注意: JXL 僅支援 `.xls` (BIFF8),`.xlsx` 請用 Apache POI。
ExcelUtilspublic class ExcelUtils {
private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);
/** 解析 Excel → List
List cols = Arrays.asList("name", "amount", "date"); // 對應 Excel 欄位順序
List> raw = ExcelUtils.parse(inputStream, cols);
List list = ExcelUtils.toBeans(raw, FeeAllocation.class, cols, row -> {
String name = row.get("name");
return name != null && !name.trim().isEmpty(); // 必填欄位校驗
});
// POI 通用解析(支援 .xls/.xlsx)
Workbook wb = WorkbookFactory.create(inputStream); // 自動識別格式
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
if (row.getRowNum() == 0) continue; // 標題
Cell nameCell = row.getCell(0);
String name = nameCell.getStringCellValue();
// ...
}
wb.close();
| 問題 | 解決 |
|---|---|
| 數字讀成科學計數法 | JXL cell.getContents() 返回原始字串,POI 需 DataFormatter |
| 日期格式混亂 | 統一在實體類用 @DateTimeFormat 或自定義轉換器 |
| 合併儲存格 | 需額外處理 sheet.getMergedCells() |
| 記憶體溢出 | 改用 POI 事件模型或分批提交入庫 |