Apache POI autoSizeColumn调整为最小宽度

9 java excel apache-poi

使用公式的值时,我很难让列正确地自动调整大小.

我通过创建一个具有最大值作为常量字符串值的隐藏行来"解决"这个问题,但这远非优雅,并且通常需要评估每个单元格中的公式以获取生成的最大字符串.虽然这种小型电子表格适用于这种情况,但对于大约16列x~6000行的纸张来说,它变得非常不切实际.

以下代码在OpenOffice中呈现.

package com.shagie.poipoc;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;

public class SimpleBug {
    public static void main(String[] args) {
        try {

            Workbook wb = new HSSFWorkbook();
            FileOutputStream fileOut = new FileOutputStream("workbook.xls");
            Sheet sheet = wb.createSheet("new sheet");

            Row row = sheet.createRow(0);
            CellStyle style = wb.createCellStyle();
            style.setDataFormat(wb.createDataFormat().getFormat("[h]:mm"));
            Cell cell = row.createCell(0);
            cell.setCellValue(123.12);
            cell.setCellStyle(style);

            row.createCell(1).setCellFormula("A1");

            row.createCell(2)
              .setCellFormula("TRUNC(A1) & \"d \" & TRUNC(24 * MOD(A1,1))" +
              " & \"h \" & TRUNC(MOD(60 * 24 * MOD(A1,1),60)) & \"m\"");

            row.createCell(3).setCellValue("foo");

            for(int i = 0; i < 4; i++) {
                sheet.autoSizeColumn(i);
            }

            wb.write(fileOut);
            fileOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

相关并尝试过:

Apache POI autoSizeColumn调整不正确我已经尝试了样式中的字体.我得到了Java所知道的所有字体列表

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
for(String font:e.getAvailableFontFamilyNames()) {
    System.out.println(font);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了使用该循环列出的几种字体,而OpenOffice更改了字体,但仍然无法正确调整大小的列.

Pop*_*ibo 10

假设您希望根据公式结果获得正确的列大小,只需执行之前插入以下行autoSizeColumn,在这种情况下,在for循环之前:

HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
Run Code Online (Sandbox Code Playgroud)

原因是autoSizeColumn根据缓存的公式评估结果确定单元格的大小,如果从未评估公式,则不知道要为其设置的大小.

码:

...

row.createCell(3).setCellValue("foo");
HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

for (int i = 0; i < 4; i++) {
    sheet.autoSizeColumn(i);
}

...
Run Code Online (Sandbox Code Playgroud)

输出(在OpenOffice中)