Java 为什么最后一列索引对于ApachePOI中的函数偏移量来说太低,以及如何处理它?
我正在使用ApachePOI进行一些手动计算,最近我遇到了一个问题,即无法对从255个索引开始的列使用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
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的旧限制进行列计数和行计数。