使用 JXLS 導入 Excel 時,長度超過 10 位的數字(如 12345678912)被自動轉為科學計數法 1.2345678E10,導致業務主鍵、身份證號、銀行卡號等關鍵字段數據失真。
Excel 單元格格式為「常規」或「數值」時,POI 底層讀取返回 NumericCellValue,JXLS 默認調用 getNumericCellValue() 獲取 double,超出精度範圍自動科學計數。
public class StringCellProcessor implements CellProcessor {
@Override
public Object process(Cell cell, Context context) {
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
// 禁用科學計數法,獲取完整數字字符串
DataFormatter formatter = new DataFormatter();
return formatter.formatCellValue(cell);
}
return cell.getStringCellValue();
}
}
配置映射:cellProcessors.put("id", new StringCellProcessor());
在 JXLS 讀取前,用 Apache POI 遍歷工作表,將目標列 setCellType(Cell.CELL_TYPE_STRING),再交給 JXLS 處理。
| 測試用例 | 預期結果 |
|---|---|
| 18 位身份證號 | 完整 18 位字符串,無科學計數 |
| 19 位銀行卡號 | 完整 19 位字符串 |
| 純數字文本 "00123" | 保留前導零 "00123" |
| 真實數值 3.14159 | 保持數值型,不影響計算 |
「模板文本格式化」一勞永逸,配合「CellProcessor 兜底」,徹底告別 JXLS 讀取長數字變科學計數法的數據質量隱患。