在使用 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);
輸出符合預期。
如果我從使用 a 切換
SXSSFWorkbook
到XSSFWorkbook
輸出,則符合預期。And most curious, if I open the resulting xlsx file, save it and close it again, then running the read part of the above code, the output is as expected.
Is that something that someone has an explanation for? Btw. I tried with different version of POI, it had the same results everytime.
uj5u.com熱心網友回復:
問題是SXSSFWorkbook
默認使用行內字串,因為這對于流式處理方法更好。但是XSSFWorkbook
,當單元格型別為 時,希望字串存??儲在共享字串表中CellType.STRING
。
因此,在創建SXSSFWorkbook
您的單元格 XML 之后,sheet1.xml
看起來像
<c r="A1" t="inlineStr">
<is>
<t>TEST</t>
</is>
</c>
型別t
是inlineStr
。并且單元格值直接是字串 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)
不再有這種效果的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439890.html
標籤:java excel apache-poi xlsx
下一篇:在Excel中按組為重復行著色