我正在使用 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();
}
文件如下所示:
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/