如何在无泛型参数的方法中按泛型类进行类型转换?(Apache POI场景)
解决Apache POI泛型二维数组按实际类型存入Excel的问题
嘿,这个需求我之前做Excel导出的时候刚好碰到过,其实核心就是要根据元素的运行时类型动态调用POI对应的单元格赋值方法,毕竟泛型擦除后我们没法在编译期确定类型,只能靠运行时判断。
核心思路
Apache POI的Cell类针对不同数值类型提供了重载的setCellValue方法(比如int、double、long等),而非数值类型我们统一转成字符串存入。所以我们只需要:
- 遍历二维数组的每个元素
- 用
instanceof判断元素的实际数值类型 - 匹配到对应类型后,强转并调用POI的对应赋值方法
- 非数值类型直接转字符串(注意处理null)
完整实现代码
下面是改造后的insert2dArrayToSheet方法示例,覆盖了常见的数值类型:
import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import java.math.BigDecimal; public void insert2dArrayToSheet(HSSFSheet sheet, Object[][] dataArray) { if (dataArray == null || dataArray.length == 0) { return; } for (int i = 0; i < dataArray.length; i++) { Row row = sheet.createRow(i); Object[] rowData = dataArray[i]; if (rowData == null) { continue; } for (int j = 0; j < rowData.length; j++) { Cell cell = row.createCell(j); Object value = rowData[j]; if (value == null) { cell.setCellValue(""); // 或者留空单元格,根据需求调整 continue; } // 逐个判断数值类型,调用对应setCellValue方法 if (value instanceof Integer) { cell.setCellValue((Integer) value); } else if (value instanceof Double) { cell.setCellValue((Double) value); } else if (value instanceof Long) { cell.setCellValue((Long) value); } else if (value instanceof Float) { cell.setCellValue((Float) value); } else if (value instanceof Short) { cell.setCellValue((Short) value); } else if (value instanceof Byte) { cell.setCellValue((Byte) value); } else if (value instanceof BigDecimal) { // 处理高精度数值,转成double存入,或者设置单元格格式保持精度 cell.setCellValue(((BigDecimal) value).doubleValue()); } else { // 非数值类型统一转字符串 cell.setCellValue(value.toString()); } } } }
为什么你之前的强制转换语法无效?
你尝试的(array[i][j].getClass()) array[i][j]这种写法在Java里是不合法的,强制转换必须显式指定具体的类型(比如(Integer) value),不能用Class对象来动态强转。而instanceof正是Java里用来判断对象运行时类型的标准方式,刚好适配我们的场景。
额外小提示
- 如果需要保留
BigDecimal的高精度,可以给单元格设置数值格式(比如保留两位小数),避免转double后的精度丢失:cell.setCellValue(((BigDecimal) value).doubleValue()); // 设置单元格格式为数值型,保留两位小数 CellStyle style = sheet.getWorkbook().createCellStyle(); DataFormat format = sheet.getWorkbook().createDataFormat(); style.setDataFormat(format.getFormat("0.00")); cell.setCellStyle(style); - 别忘了处理
null值,否则容易抛出NullPointerException,上面的代码里已经加了判断。
内容的提问来源于stack exchange,提问作者Anton H
相关产品推荐
相关产品推荐

