Apache POI的autoSizeColumn()行为怪异

在标记为重复之前请阅读完整。 我已经看到所有相关/类似的问题,我想我在这里发生了一些奇怪的事情。

我正在使用Apache POI版本3.9来生成一个4工作表。 每次填写完表格后,我都会自动调整列的大小。 代码如下:

for (String alias : map.keySet()) { Sheet sheet = workbook.createSheet(getSheetNameForAlias(alias)); List<Object[]> resultList = (List<Object[]>) map.get(alias); Collections.sort(resultList.subList(1, resultList.size()), getComparator(alias)); int rownum = 0; for (Object[] array : resultList) { rownum = populateRow(cellStyles, sheet, rownum, array, false); } for(int j=0; j< resultList.get(0).length; j++){ sheet.autoSizeColumn(j, false); } } 

populateRow函数是:

 private int populateRow(CellStyle[] cellStyles, Sheet sheet, int rownum, Object[] dataArr, boolean doAutoSizing) { if (logger.isDebugEnabled()) { logger.debug("Populating row ... @{} : {} ", sheet.getSheetName(), rownum); } int cellnum; Row row = sheet.createRow(rownum++); cellnum = 0; if (ArrayUtils.isEmpty(dataArr)) { logger.error("No data found for row ... @{} : {} ", sheet.getSheetName(), rownum); return rownum; } for (Object obj : dataArr) { Cell cell = row.createCell(cellnum++); // get the type of the data inserted in the cell. // Accordingly set the cell value String data = String.valueOf(obj); if (StringUtils.isBlank(data) || "null".equals(data)) { cell.setCellValue(StringUtils.EMPTY); } else { if (NumberUtils.isNumber(data)) { Double dbVal = NumberUtils.createDouble(data); // Millions separator for Numeric fields if (dbVal == Math.ceil(dbVal)) { cell.setCellStyle(cellStyles[0]); } else { cell.setCellStyle(cellStyles[1]); } cell.setCellType(Cell.CELL_TYPE_NUMERIC); // for numeric , set cell type as numeric cell.setCellValue(dbVal); } else { if(obj instanceof java.sql.Timestamp || obj instanceof java.sql.Date){ cell.setCellStyle(cellStyles[2]); } cell.setCellValue(data); } if (doAutoSizing) { sheet.autoSizeColumn(cellnum - 1); } data = null; } obj = null; } return rownum; } 

怪异的部分是,四个表中的一个的列被错误地resize。

我试着在头脑中用不同的方法重新编写auto size逻辑,并发现表单,我得到这个不正确的行为,如果我尝试sheet.getRow(0) ,它给出null指定有没有该行的数据,但生成的Excel不能保持良好,所有四张表都有适当的数据。 而且在任何情况下,第一行总是标题,所以即使它下面没有数据也不能为空。

我不知道我错过了什么,但我试过,发现它不是JVM的Font问题。

如果您需要其他信息,请让我知道。

编辑:观察到自动resize超过100行的工作表正确地工作。 我不知道如何把它与一些逻辑联系起来。 这是真正的WEIRD。

编辑2:我find了Axel在寻找别的东西时给出的正式参考。 这足以令我困惑。 阅读以下链接的段落

既然你说它最多可以处理100行,看起来你正在使用SXSSFWorkbook ,而不是XSSFWorkbook 。 那么这种行为是可以预料的,因为只有固定数量的行被保存在内存中,只有这些行才会被考虑。 所以,如果我是对的,你将不得不切换到使用XSSFWorkbook (当处理大量的行时,这不会导致OOM)。