java - 为什么 Apache POI 中的 Offset 函数最后一列索引太低以及如何处理?

标签 java apache-poi

我正在使用 Apache POI 进行一些手动计算,最近我遇到了一个问题,即无法对从 255 索引开始的列使用 OFFSET 公式。

例如

XSSFCell cell = sheet.getRow(1).createCell(1);
cell.setCellFormula("OFFSET(IV220,0,1)");

XSSFFormulaEvaluator evaluator = 
workbook.getCreationHelper().createFormulaEvaluator();

evaluator.evaluateInCell(cell)

cell 变量内的值始终为 #REF!。另外,请记住 IV220 的列索引是 255。如果我将列索引减少 1,那么它将产生一个有效值:

cell.setCellFormula("OFFSET(IU220,0,1)");

我发现org.apache.poi.ss.formula.functions.Offset有一个验证来检查列索引是否长于255。这是因为支持一些过时的文档格式?

我正在使用 Apache POI 版本:4.0.0

最佳答案

可能您正在使用.xls 文件并要创建此类文件。但它不支持太多列

最多支持 65536 行和 256 列

但是如果您使用更新的格式XLSX支持1048576行和16384列

MS Excel 支持相应的行和列

+-----------------+-----------+--------------+---------------------+
|                 | Max. Rows | Max. Columns | Max. Cols by letter |
+-----------------+-----------+--------------+---------------------+
| Excel 365*      | 1,048,576 | 16,384       | XFD                 |
| Excel 2013      | 1,048,576 | 16,384       | XFD                 |
| Excel 2010      | 1,048,576 | 16,384       | XFD                 |
| Excel 2007      | 1,048,576 | 16,384       | XFD                 |
| Excel 2003      | 65,536    | 256          | IV                  |
| Excel 2002 (XP) | 65,536    | 256          | IV                  |
| Excel 2000      | 65,536    | 256          | IV                  |
| Excel 97        | 65,536    | 256          | IV                  |
| Excel 95        | 16,384    | 256          | IV                  |
| Excel 5         | 16,384    | 256          | IV                  |
+-----------------+-----------+--------------+---------------------+

但是这里您使用的是XSSF,这意味着您的文件采用.xlsx格式,因此它将支持此限制。但如果您的文件采用 .xls 格式,则不支持此限制。

如果您使用.xlsx文件,您可以尝试此代码。也许它会对你有所帮助。

private static void writeData() throws IOException {

        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet();

        int r = 0;
        for (int i=0;i<2;i++) {
            Row row = sheet.createRow(r++);
            int column = 0;
            for (int j =0;j<2;j++) {
                XSSFCell cell = (XSSFCell) row.createCell(column++);
                if (r == 1 || column == 1) cell.setCellValue(i);

                else if (column == 2) {
                    cell.setCellFormula("OFFSET(IU220,0,1)");
                }
            }
        }


        FileOutputStream fileOut = new FileOutputStream("stackProblem.xlsx");
        workbook.write(fileOut);
        workbook.close();
    }

文件如下所示:

enter image description here

evaluator.evaluateInCell(cell); 不支持超过 255 列。您可以使用evaluator.evaluate(cell);

试试这个

public static void main(String[] args) throws IOException {
        writeData();
    }

    private static void writeData() throws IOException {

        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet();


        XSSFRow row218 = sheet.createRow(218);
        XSSFCell vv2180 = (XSSFCell) row218.createCell(255);
        vv2180.setCellValue(50);

        XSSFCell vv2181 = (XSSFCell) row218.createCell(256);
        vv2181.setCellValue(69);

        XSSFRow row219 = sheet.createRow(219);
        XSSFCell vv0 = (XSSFCell) row219.createCell(255);
        vv0.setCellValue(40);

        XSSFCell vv = (XSSFCell) row219.createCell(256);
        vv.setCellValue(70);

        XSSFRow row220 = sheet.createRow(220);
        XSSFCell vv2200 = (XSSFCell) row220.createCell(255);
        vv2200.setCellValue(30);

        XSSFCell vv220 = (XSSFCell) row220.createCell(256);
        vv220.setCellValue(20);


        XSSFCell cell = sheet.createRow(1).createCell(1);
        cell.setCellFormula("OFFSET(IV220,0,1)");
        XSSFFormulaEvaluator evaluator =
                (XSSFFormulaEvaluator) workbook.getCreationHelper().createFormulaEvaluator();

        evaluator.evaluate(cell);


        FileOutputStream fileOut = new FileOutputStream("stackProblem.xlsx");
        workbook.write(fileOut);
        workbook.close();
    }

poi库的一个很好的引用:apche poi HSSF vs XSSF

关于java - 为什么 Apache POI 中的 Offset 函数最后一列索引太低以及如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53525333/

相关文章:

java - Android 在将 json 发布到 web 服务时发送空参数

java - 将 onCreateOptionsMenu 结果删除为 NullPointerException

java - 如何通过 Selenium-Java 连接到 putty 来执行命令集并验证 putty 窗口中的输出

java - 用于阅读的 Apache POI Streaming (SXSSF)

java - 按类别将一个集合拆分为多个集合

java - Javax.servlet依赖项不起作用

apache - 使用 poi 的单元格垂直顶部对齐

java - 为什么我的 Apache POI 代码无法读取 excel 工作表?

java - 如何用Java读取Excel的输入?

java - 使用 Java 打印 Excel 工作表中的空单元格相邻单元格值