Apache POI autoSizeColumn 调整大小不正确

2022-09-01 12:04:33

我正在使用Java中的Apache POI来创建一个excel文件。我填写数据,然后尝试自动调整每列的大小,但是大小总是错误的(我认为是一致的)。前两行总是(?)完全折叠。当我在Excel中自动调整列大小时,它可以完美地工作。

没有写空白单元格(我相信),调整大小是我做的最后一件事。

以下是相关代码:这是一个没有错误处理的简化版本,等等。

public static synchronized String storeResults(ArrayList<String> resultList, String file) {
    if (resultList == null || resultList.size() == 0) {
        return file;
    }
    FileOutputStream stream = new FileOutputStream(file);

    //Create workbook and result sheet
    XSSFWorkbook book = new XSSFWorkbook();
    Sheet results = book.createSheet("Results");

    //Write results to workbook
    for (int x = 0; x < resultList.size(); x++) {
        String[] items = resultList.get(x).split(PRIM_DELIM);

        Row row = results.createRow(x);
        for (int i = 0; i < items.length; i++) {
            row.createCell(i).setCellValue(items[i]);
        }
    }

    //Auto size all the columns
    for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) {
        results.autoSizeColumn(x);
    }

    //Write the book and close the stream
    book.write(stream);
    stream.flush();
    stream.close();

    return file;
}

我知道有一些类似的问题,但其中大多数只是在填写数据之前调整大小的情况。而少数没有的则更复杂/没有答案。

编辑:我尝试使用几种不同的字体,但它不起作用。这并不奇怪,因为无论字体如何,要么所有列都应该完全折叠,要么不应该完全折叠。

另外,由于出现了字体问题,因此我在Windows 7上运行该程序。

解决:这是一个字体问题。我发现唯一有效的字体是衬线。


答案 1

只是为了从我的评论中做出答案。行的大小不正确,因为Java不知道您尝试使用此链接的字体,如果您想将新字体安装到Java中以便使用更花哨的东西,应该会有所帮助。它还具有Java知道的默认字体列表。

很高兴这有帮助,你得到了你的问题解决!


答案 2

这可能与此POI错误有关,该错误Java错误JDK-8013716有关:Calibri和Cambria字体的渲染器自更新45以来失败

在这种情况下,更改字体或使用高于6u45 / 7u21的JRE应该可以解决此问题。

您还可以通过使用如下代码来修复问题并避免列完全折叠:

    sheet.autoSizeColumn(x);

    if (sheet.getColumnWidth(x) == 0) {
      // autosize failed use MIN_WIDTH
      sheet.setColumnWidth(x, MIN_WIDTH);
    }

推荐