Apache POI-3.17生成Excel在MS Access中多空列问题求助
问题根源
这是Apache POI 3.17版本的特定兼容性bug,该版本生成XLSX文件时,对工作表列数元数据的处理存在异常,导致MS Access读取时错误识别出额外空白列;而Excel自身的列识别逻辑更宽松,因此不会显现该问题。
可行解决方案
1. 显式指定工作表的有效列数
在写入工作簿前,手动设置工作表的最后有效列编号,覆盖POI 3.17错误生成的元数据:
// 在创建完所有单元格后、workbook.write(baos)之前添加以下代码 // 注:setLastCellNum参数为实际使用的列数(0、1列对应列数为2) sheet.setLastCellNum(2); workbook.write(baos);
2. 切换到稳定POI版本
既然测试验证了3.11、3.7、4.x、5.18版本均无此问题,直接将POI版本切换到这些成熟版本(推荐4.1.2,兼顾兼容性和稳定性),从根源避开该bug。
3. 清理行的无效单元格元数据(仅限必须使用3.17的场景)
你之前尝试row.removeCell(getCell(2))触发空指针异常,是因为该行根本不存在索引为2的单元格,getCell(2)返回null。可以通过以下方式安全清理:
// 实际使用的最大列索引是1(0、1两列) int maxUsedCol = 1; // 遍历所有超出范围的单元格索引 for (int colIdx = maxUsedCol + 1; colIdx <= row.getLastCellNum(); colIdx++) { XSSFCell cell = row.getCell(colIdx); if (cell != null) { row.removeCell(cell); } } // 更新行的最后单元格编号 row.setLastCellNum(maxUsedCol + 1); // 再设置工作表的最后列编号 sheet.setLastCellNum(maxUsedCol + 1);
内容的提问来源于stack exchange,提问作者Shavi Anand
相关产品推荐
相关产品推荐

