You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:27:39