Java实现xlsx转csv时整数被转为float类型的问题如何处理
问题原因
Apache POI 中所有标注为NUMERIC类型的单元格,调用getNumericCellValue()方法时统一返回double类型,整数值会自动补.0变为浮点格式,就是你遇到的整数转float的问题。
解决方法
方案1:修改原有NUMERIC分支判断逻辑
兼容日期格式和整数/小数格式的数值单元格,修改switch中NUMERIC分支的代码即可:
case NUMERIC: // 先判断单元格是否为日期格式(日期在POI中也属于NUMERIC类型) if (DateUtil.isCellDateFormatted(cell)) { // 自定义日期输出格式,可按需调整 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); data.append(sdf.format(cell.getDateCellValue())).append(","); } else { double numVal = cell.getNumericCellValue(); // 判断是否为整数 if (numVal == Math.floor(numVal) && !Double.isInfinite(numVal)) { // 整数转long输出,避免带.0后缀 data.append((long) numVal).append(","); } else { // 小数直接输出 data.append(numVal).append(","); } } break;
需要提前导入对应依赖类:
org.apache.poi.ss.usermodel.DateUtiljava.text.SimpleDateFormat
方案2:使用DataFormatter工具类(更通用)
POI自带的DataFormatter可以直接读取单元格在Excel中显示的原始字符串,无需手动判断类型,适配所有单元格格式,代码更简洁:
- 先在单元格循环外初始化工具类:
DataFormatter dataFormatter = new DataFormatter();
- 原有整个switch判断逻辑可以替换为一行代码:
String cellValue = dataFormatter.formatCellValue(cell); data.append(cellValue).append(",");
导入对应类:org.apache.poi.ss.usermodel.DataFormatter
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

