java使用poi读取excel时,因一些格式问题,执行excel函数错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java使用poi读取excel时,因一些格式问题,执行excel函数错误相关的知识,希望对你有一定的参考价值。

这个excel文件中内容比较多,其中有部分求和写成了这样:=SUM(,AR1902,AR1897,AR1882,AR1912,AR1889,AR1908)
在excel中并没有提示什么错误,直接将求和的结果显示出来了,但是,我用poi执行到这些个单元格的时候,这会出现如下错误:
Exception in thread "main" java.lang.RuntimeException: Invalid ValueEval type passed for conversion: (class org.apache.poi.hssf.record.formula.eval.MissingArgEval)
at org.apache.poi.hssf.record.formula.functions.MultiOperandNumericFunction.collectValue(MultiOperandNumericFunction.java:194)
at org.apache.poi.hssf.record.formula.functions.MultiOperandNumericFunction.collectValues(MultiOperandNumericFunction.java:154)
at org.apache.poi.hssf.record.formula.functions.MultiOperandNumericFunction.getNumberArray(MultiOperandNumericFunction.java:127)
at org.apache.poi.hssf.record.formula.functions.MultiOperandNumericFunction.evaluate(MultiOperandNumericFunction.java:89)
at org.apache.poi.hssf.record.formula.eval.FunctionEval.evaluate(FunctionEval.java:247)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:374)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:257)
at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:203)
at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateFormulaCellValue(XSSFFormulaEvaluator.java:252)
at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateFormulaCell(XSSFFormulaEvaluator.java:145)
at com.yuan.PoiExcel.read(PoiExcel.java:134)
at com.yuan.PoiExcel.<init>(PoiExcel.java:36)
at com.yuan.Main.main(Main.java:10)

在excel中手动将=SUM(,AR1902,AR1897,AR1882,AR1912,AR1889,AR1908)
改成=SUM(AR1902,AR1897,AR1882,AR1912,AR1889,AR1908)就不会出现这种错误
但是,excel中写成这样格式的不止这么一个单元格,全部手动改不现实,
所以想在程序里做点改动,求大神们帮帮忙!
谢谢!

思路很简单:
1、在程序里取得公式
2、在公式执行之前校验格式,把多余的都好去掉(简单的replace)
3、然后再进行计算追问

我用setCellValue重新设置了公式,可是结果还是这样,而且重新设置过公式之后,将那个单元格的内容打印出来,发现还是设置之前的样子

追答

有程序吗?发过来我帮你调试
912440916@qq.com

参考技术A 公式格式识别不了。只能用java将第一个“,”截掉。在用公式追问

我将第一个','截掉之后,用setCellValue重新设置了对应的单元格的内容,可貌似没有什么效果

追答

我看你怎么截的。
最好是 .replace("(,","(")

追问

直接用了两次subString,然后相加

追答

你这样不行的因为你不能确定每个公式都是=SUM(,AR1902,AR1897,AR1882,AR1912,AR1889,AR1908) 这样的格式。
如果是=SUM(AR1902,AR1897,AR1882,AR1912,AR1889,AR1908)的你就会把A截掉。会出错。

追问

我确定,里面都是求和,还有,截取之前我做了判断的

追答

还是会报错?

追问

修改好了之后,将那个单元格的内容打印出来,根本就没有变化...
row.getCell(j).setCellValue(tmp_str);
System.out.println(row.getCell(j).toString());
打印出来还是修改之前的内容

追答

你打印下tmp_str看看是什么。慢慢调试总会好的

追问

打印过了,tmp_str就是修改过了之后的

追答

我有点晕了。这是System.out.println(row.getCell(j).toString());修改前的??

追问

肯定是修改之后打印的啊

java利用poi技术导入批量excel数据,并且分段存入数据库怎么解决

注意引入的都是poi的包,使用Cell,excel2003的.xls对应是HSSFCell,而之后的xlsx对应的则是XSSFCell,但是他们都继承于Cell,所以使用Cell就可以使用两种格式的excel导入了,下面解决excel中数据的各种格式
[java] view plaincopy
//读取excel
try
request.setCharacterEncoding("gbk");
response.setContentType("text/html;charset=gbk");
// 1. 创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2. 创建FileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);

// 3. 判断是否是上传表单
// boolean b = upload.isMultipartContent(request);
// 设置上传文件最大值
upload.setSizeMax(25 * 1024 * 1024);
// 是文件上传表单
// 4. 解析request,获得FileItem项
List<FileItem> fileitems = upload.parseRequest(request);
// 5. 遍历集合
for (FileItem item : fileitems)
// 判断是不是普通字段
if (!item.isFormField())
// 获得流,读取数据写入文件
InputStream in = item.getInputStream();
Workbook book = createWorkBook(in,item.getName());
// 获得第一个工作表对象
Sheet sheet = book.getSheetAt(0);
if(0==sheet.getLastRowNum())
//如果没有数据
request.setAttribute("message", "excel的sheet0中不存在数据");
request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response);


// 第一行为标题,从第二行开始录入
for (int i = 1; i <= sheet.getLastRowNum(); i++)
//标题行,用来对比方便得到数据
Row titleRow = sheet.getRow(0);
//数据行
Row row = sheet.getRow(i);
//获得值
String value_temp= this.getValue((Cell) row.getCell(2));




catch (Exception e)
e.printStackTrace();
message="导入失败<br/>"+message;
request.setAttribute("message",message);
request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response);

参考技术A 你这边说的分段存入数据库是怎么个意思呢???

以上是关于java使用poi读取excel时,因一些格式问题,执行excel函数错误的主要内容,如果未能解决你的问题,请参考以下文章

java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来

java poi读取excel日期格式数据

java poi读取excel含小数列时,与excel显示不一样

java poi 读取excel文件 用wps编辑之后不能读取,只能读取office的

java poi 导入 excel怎么设置单元格格式为 文字

Java使用POI读取和写入Excel指南