gpt4 book ai didi

Java Apache POI 错误

转载 作者:行者123 更新时间:2023-12-04 22:13:37 25 4
gpt4 key购买 nike

在使用 Apache POI 实现时,我遇到了一个奇怪的行为。我无法解释原因,所以如果有人可以提供一些提示,我很想听听。对于我正在解决的问题,它甚至不是一个大障碍——在这一点上,它更像是一件好奇的事情。所以这里是:

public static void main(String[] args) throws EcatException, SQLException, IOException, Exception {

long ts = System.currentTimeMillis();
SXSSFWorkbook wb = new SXSSFWorkbook();
SXSSFSheet test = wb.createSheet("Test");
SXSSFRow r = test.createRow(0);
Cell c = r.createCell(0);
c.setCellValue("TEST");

wb.write(new FileOutputStream("D:/wb-" + ts + ".xlsx"));
wb.close();

XSSFWorkbook wb2 = new XSSFWorkbook("D:/wb-" + ts + ".xlsx");
XSSFSheet s = wb2.getSheet("Test");

s.getRow(0).getCell(0).setCellType(CellType.STRING);
System.out.println(s.getRow(0).getCell(0).getStringCellValue());
wb2.close();

}
如您所见,这将创建一个 SXSSFWorkbook一行和一个单元格的值为“TEST”。
然后再次打开工作簿,并将该单元格的内容打印到控制台。
我的期望是在控制台上看到“TEST”,但我没有。输出为空。
  • 如果我删除行
  • s.getRow(0).getCell(0).setCellType(CellType.STRING);
    输出符合预期。
  • 如果我从使用 SXSSFWorkbook 切换至XSSFWorkbook输出符合预期。
  • 最奇怪的是,如果我打开生成的 xlsx 文件,保存并再次关闭它,然后运行上面代码的读取部分,输出与预期的一样。

  • 有人对此有解释吗?
    顺便提一句。我尝试了不同版本的 POI,每次都有相同的结果。

    最佳答案

    问题是 SXSSFWorkbook默认情况下使用内联字符串,因为这更适合流式处理方法。但是XSSFWorkbook当单元格类型为 CellType.STRING 时,期望字符串存​​储在共享字符串表中.
    所以在创建 SXSSFWorkbook 之后sheet1.xml 中的单元格 XML好像

    <c r="A1" t="inlineStr">
    <is>
    <t>TEST</t>
    </is>
    </c>
    类型 tinlineStr .并且单元格值直接是字符串 TEST 。
    但是在 Cell.setCellType(CellType.STRING) 之后类型 t设置 s .这期望该值是一个数字,它是共享字符串表中字符串的索引。但没有这样的。这就是为什么 System.out.println(s.getRow(0).getCell(0).getStringCellValue());不能打印任何东西。
    你可以做 SXSSFWorkbook wb = new SXSSFWorkbook(null, 100, true, true)强制 SXSSFWorkbook也可以使用共享字符串表。但这会在流式传输方法中降低性能,因为所有字符串都需要存储在该共享字符串表中,而不是直接存储在单元格中。
    共享字符串表的好处是节省内存,因为所有字符串只存储一次,并且当多个单元格使用相同的字符串时,只有它们的索引存储在单元格中。
    Excel 本身从不使用内联字符串而不是使用共享字符串表来存储工作簿。因此,在 Excel 中打开并重新保存后,内联字符串将替换为共享字符串表中字符串的索引,并且单元格类型始终为 s。而不是 inlineStr .这就是为什么 Cell.setCellType(CellType.STRING)不会再有这种效果了。

    关于Java Apache POI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71395373/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com