Java 爪哇州警察局:得到一个;意外的ptg等级“;尝试使用Apache POI计算单元格公式时出错

Java 爪哇州警察局:得到一个;意外的ptg等级“;尝试使用Apache POI计算单元格公式时出错,java,excel,apache,apache-poi,Java,Excel,Apache,Apache Poi,我有一个小工具,它使用ApachePOI3.17读取excel文件。但该工具无法处理excel文件,因为excel文件的某些单元格具有查找公式,如下所示: 查找(B2,{“苹果”、“橘子”、“葡萄”、“香蕉”、“芒果”},{1,2,3,4,5}) 我只想得到公式单元格的字符串值。我怎样才能解决这个问题 编辑: 我只想得到单元格的公式结果。我怎样才能解决这个问题 我的代码: File file = new File("D:/temp/spec.xls"); HSSFWorkbook workboo

我有一个小工具,它使用ApachePOI3.17读取excel文件。但该工具无法处理excel文件,因为excel文件的某些单元格具有查找公式,如下所示:

查找(B2,{“苹果”、“橘子”、“葡萄”、“香蕉”、“芒果”},{1,2,3,4,5})

我只想得到公式单元格的字符串值。我怎样才能解决这个问题

编辑: 我只想得到单元格的公式结果。我怎样才能解决这个问题

我的代码:

File file = new File("D:/temp/spec.xls");
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
HSSFSheet sheet = workbook.getSheet("sheet1");
CellReference cellRef = new CellReference("B3");
HSSFCell cell = sheet.getRow(cellRef.getRow()).getCell(cellRef.getCol());

HSSFFormulaEvaluator formulaEval = 
workbook.getCreationHelper().createFormulaEvaluator();
HSSFDataFormatter dataFormatter = new HSSFDataFormatter();

System.out.println(dataFormatter.formatCellValue(cell, formulaEval));
以下是stacktrace:

java.lang.RuntimeException: Unexpected ptg class (org.apache.poi.ss.formula.ptg.ArrayPtg)
at org.apache.poi.ss.formula.WorkbookEvaluator.getEvalForPtg(WorkbookEvaluator.java:682)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:516)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:278)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:220)
at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:200)
at org.apache.poi.ss.formula.BaseFormulaEvaluator.evaluateFormulaCellEnum(BaseFormulaEvaluator.java:192)
at org.apache.poi.ss.usermodel.DataFormatter.formatCellValue(DataFormatter.java:986)
at org.apache.poi.ss.usermodel.DataFormatter.formatCellValue(DataFormatter.java:944)
at org.apache.poi.ss.usermodel.DataFormatter$formatCellValue$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at ideaGroovyConsole.run(ideaGroovyConsole.groovy:19)
at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:263)
at groovy.lang.GroovyShell.run(GroovyShell.java:518)
at groovy.lang.GroovyShell.run(GroovyShell.java:497)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:169)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:71)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at console.run(console.txt:25)
at groovy.ui.GroovyMain.processReader(GroovyMain.java:631)
at groovy.ui.GroovyMain.processFiles(GroovyMain.java:539)
at groovy.ui.GroovyMain.run(GroovyMain.java:382)
at groovy.ui.GroovyMain.process(GroovyMain.java:370)
at groovy.ui.GroovyMain.processArgs(GroovyMain.java:129)
at groovy.ui.GroovyMain.main(GroovyMain.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:65)

在不使用公式eval的情况下获取单元格内容。@Xavierboucle谢谢!但也许我没说清楚。我需要的是公式结果,而不是公式本身。我必须用公式来计算公式,对吗?您是否介意更具体地说明在没有公式eval的情况下获取单元格内容?单元格是否在ms Excel中计算?并尝试在不引用B2的情况下进行计算,但直接在B3中使用B2内容。Poi不计算B3中的B2。@Xavierboucle,但B2内容在不同的excel文件中有所不同,因此有必要引用B2。如果POI没有评估B3中的B2,这是否意味着我们目前没有解决方案?我发现一篇帖子也有同样的例外,似乎POI现在不支持公式。在没有公式eval的情况下获取单元格内容。@Xavierboucle谢谢!但也许我没说清楚。我需要的是公式结果,而不是公式本身。我必须用公式来计算公式,对吗?您是否介意更具体地说明在没有公式eval的情况下获取单元格内容?单元格是否在ms Excel中计算?并尝试在不引用B2的情况下进行计算,但直接在B3中使用B2内容。Poi不计算B3中的B2。@Xavierboucle,但B2内容在不同的excel文件中有所不同,因此有必要引用B2。如果POI没有评估B3中的B2,这是否意味着我们目前没有解决方案?我发现一篇帖子也有同样的例外,似乎POI现在不支持这个公式。