我正在使用ApachePOI3.17HSSF创建一个电子表格,其中包含一个使用"IFERROR“的公式。有人知道为什么这个版本不接受"IFERROR“并显示@@.吗?下面是一个简单的代码。如果我使用XSSF,它可以工作,但我想知道为什么HSSF显示@@.

pom.xml
...
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
</dependencies>Main.java
public static void main(String[] args) throws Exception{
HSSFWorkbook w = new HSSFWorkbook();
HSSFSheet s = w.createSheet("test");
HSSFRow r = s.createRow(0);
HSSFCell c = r.createCell(0);
c.setCellFormula("IFERROR(1/0,-1)");
File f = new File("c:/temp/test.xls");
OutputStream o = new BufferedOutputStream(new FileOutputStream(f));
w.write(o);
o.flush();
o.close();
w.close();
}发布于 2022-09-28 13:41:24
这也发生在我身上。如前所述,Apache的HSSF以Excel97-2003的二进制BIFF格式生成*.xls文件。但IFERROR函数是在Excel 2007中引入的。因此HSSF不能正确地存储IFERROR函数。只有XSSF能够这样做,因为XSSF以Excel2007的Office格式生成*.xlsx文件。
我找到的解决方案是:在公式中添加“_xlfn”。在给出错误的函数之前。
在这种情况下
//PREVIOUS
//c.setCellFormula("IFERROR(1/0,-1)");
//
//MODIFY TO
c.setCellFormula("_xlfn.IFERROR(1/0,-1)");正如我所见的“_xlfn”这意味着它是一个在该版本中不存在的公式,并使其不存在,在java中验证它,并按照您的预期在excel中写入它。
https://stackoverflow.com/questions/65947655
复制相似问题