Java 为什么最后一列索引对于ApachePOI中的函数偏移量来说太低,以及如何处理它?

Java 为什么最后一列索引对于ApachePOI中的函数偏移量来说太低,以及如何处理它?,java,apache-poi,Java,Apache Poi,我正在使用ApachePOI进行一些手动计算,最近我遇到了一个问题,即无法对从255个索引开始的列使用OFFSET公式 比如说 XSSFCell cell = sheet.getRow(1).createCell(1); cell.setCellFormula("OFFSET(IV220,0,1)"); XSSFFormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); evalua

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

比如说

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

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

evaluator.evaluateInCell(cell)
单元格
变量内的值总是
#REF。另外,请记住,
IV220
的列索引是255。如果我将列索引减少1,则会产生一个有效值:

cell.setCellFormula("OFFSET(IU220,0,1)");
我发现,
org.apache.poi.ss.formula.functions.Offset
有一个验证来检查列索引是否大于255。这是因为支持一些过时的文档格式吗


我正在使用ApachePOI版本: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();
    }

poi库的一个很好的参考资料:

可能是您正在使用.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();
    }

poi库的良好参考资料:

谢谢您的回复!请在示例中执行下面的代码,并检查变量
cell
的值是否有效(没有
#REF!
XSSFCell cell=sheet.getRow(1).createCell(1);setCellFormula(“偏移量(IV220,0,1)”);XSSFFormulaEvaluator evaluator=工作簿.getCreationHelper().createFormulaEvaluator();evaluator.evaluateInCell(cell)
我试过了,但还是不起作用。我正在使用
xlsx
文件格式以及
XSSFSheet
在Java中的实现。它在LibreOffice中打开时工作,但我需要从应用程序中的
OFFSET
函数中获取值。你能再检查一下你是否能得到no
#REF偏移量(IV220,0,1)
cell.getRawValue()
(使用我在上面的注释中共享的代码)是的,您是正确的计算器。evaluateInCell(单元格);函数不适用于超过255列,您可以使用evaluator.evaluate(单元格);这两种方法几乎都是相同的验证方法,但其中一种工作正常,另一种不适用于超过255列。但可能这种方法也能解决您的问题谢谢您的努力!我决定用索引替换偏移公式,因为最新的excel格式似乎不支持该公式。谢谢您的回复!请在示例中执行下面的代码,并检查变量
cell
的值是否有效(没有
#REF!
XSSFCell cell=sheet.getRow(1).createCell(1);setCellFormula(“偏移量(IV220,0,1)”);XSSFFormulaEvaluator evaluator=工作簿.getCreationHelper().createFormulaEvaluator();evaluator.evaluateInCell(cell)
我试过了,但还是不起作用。我正在使用
xlsx
文件格式以及
XSSFSheet
在Java中的实现。它在LibreOffice中打开时工作,但我需要从应用程序中的
OFFSET
函数中获取值。你能再检查一下你是否能得到no
#REF偏移量(IV220,0,1)
cell.getRawValue()
(使用我在上面的注释中共享的代码)是的,您是正确的计算器。evaluateInCell(单元格);函数不适用于超过255列,您可以使用evaluator.evaluate(单元格);这两种方法几乎都是相同的验证方法,但其中一种工作正常,另一种不适用于超过255列。但可能这种方法也能解决您的问题谢谢您的努力!我决定用索引替换偏移量公式,因为最新excel格式似乎不支持该公式。
apache poi
FormlaEvaluator
在为
XSSF
计算
OFFSET
时肯定是错误的,因为它对列计数和行计数使用了excel 2003的旧限制。
apachepoi
FormlaEvaluator
在计算
XSSF的
偏移量
时肯定是错误的,因为它使用Excel 2003的旧限制进行列计数和行计数。