Apache POI设置布尔值单元格样式异常问题咨询
解决Apache POI写入布尔值后单元格显示为数值型的问题
我太懂这个坑了——明明写入的是布尔值true/false,Excel里却显示成1/0,而且手动找CellStyle的dataFormat短整数值根本摸不着头绪!别慌,咱们用正确的方式来搞定它:
核心问题
你直接调用cell.setCellValue(true)时,POI确实会把单元格类型设为布尔型,但Excel如果没有匹配的逻辑型格式,就可能用数值格式来显示。而且XLSX格式(XSSFWorkbook)的内置格式索引不是固定的硬编码数字,你硬猜0到某个范围的short值肯定找不到合适的。
正确解决方案:用DataFormat获取内置逻辑型格式索引
我们需要借助DataFormat类来获取Excel内置的布尔型格式对应的索引,而不是自己瞎试数字。代码示例如下:
private void writeToDocument(XSSFWorkbook workbook) { Sheet sheet = workbook.createSheet("testSheet"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue(true); // 创建样式并绑定逻辑型格式 CellStyle booleanCellStyle = workbook.createCellStyle(); DataFormat dataFormat = workbook.createDataFormat(); // 获取Excel内置的"TRUE/FALSE"格式索引 short boolFormatIndex = dataFormat.getFormat("TRUE/FALSE"); booleanCellStyle.setDataFormat(boolFormatIndex); cell.setCellStyle(booleanCellStyle); }
额外选项:自定义布尔显示样式
如果你不想显示TRUE/FALSE,而是想要Yes/No或者Y/N这类样式,也可以用DataFormat自定义格式:
// 自定义显示为Yes/No short yesNoFormatIndex = dataFormat.getFormat("Yes/No"); booleanCellStyle.setDataFormat(yesNoFormatIndex);
为什么不用硬编码的short值?
对于XLSX格式(XSSF),Excel的内置格式索引是动态分配的,不同工作簿可能不一样;而XLS格式(HSSF)虽然有固定索引(比如布尔型是4),但为了兼容两种格式,用DataFormat.getFormat()是最可靠的做法。
内容的提问来源于stack exchange,提问作者Korbinian Reffler
相关产品推荐
相关产品推荐

