【问题标题】:Apache POI autoSizeColumn resizes to minimum widthApache POI autoSizeColumn 调整为最小宽度
【发布时间】:2017-11-10 01:58:17
【问题描述】:

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

我已经通过创建一个隐藏行来“解决”这个问题,该行将最大值作为常量字符串值,但这远非优雅,并且通常需要评估每个单元格中的公式以获得生成的最大字符串。虽然这种方法适用于如此小的电子表格,但对于约 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 更改了字体时,列的大小仍然不正确。

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

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

    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)

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多