java - Apache POI autoSizeColumn 将大小调整为最小宽度

标签 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();
        }

    }
}

相关和尝试过的:

Apache POI autoSizeColumn Resizes Incorrectly我试过样式中的字体。我得到了 Java 可以识别的所有字体的列表

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
for(String font:e.getAvailableFontFamilyNames()) {
    System.out.println(font);
}

我尝试了该循环列出的几种字体,虽然 OpenOffice 更改了字体,但列的大小仍然不正确。

最佳答案

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

HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

原因是 autoSizeColumn 根据缓存的公式计算结果调整单元格大小,如果从未计算过公式,它就不知道要为其设置什么大小。

代码:

...

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

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

...

Output (in OpenOffice)

关于java - Apache POI autoSizeColumn 将大小调整为最小宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924299/

相关文章:

java - 连接拒绝 LDAP (Java)

ruby检查csv中的字符串是否会被误认为日期(在excel中)

java - 如何将.jar文件添加到javac编译中(Windows 10)

java - 以编程方式发送 Whatsapp 消息到特定号码

java - 我怎样才能让我的程序接受超过 9 位数的数字?

excel - 从 Excel 调用具有多个参数的存储过程

excel - 无法安装 ImportExcel Powershell 模块

java - Apache POI 将 txt 文件读取为 excel 文件

Java Apache POI 错误 : XMLEventFactory Provider com. ctc.wstx.stax.WstxEventFactory 未找到

java - 两个 Web 应用程序之间 cacerts 文件通信的作用