easyexcel解析xls文件:Convert excel format exception.You can try specifying the ‘excelType‘ yourself
layui导出的excel文件easyexcel无法读取?
文章共1,345字 · 阅读需要大约5分钟
一键AI生成摘要,助你高效阅读
问答
·
今天遇到一个问题,使用layui前端框架,table.export导出的excel再导入,后台easyExcel识别不是excel文件。
前端:layui
后端:jfinal
业务是这样,要导入学生成绩,首先下载一个模板,模板中包含学生名单,用户只需要下载模板填入成绩后,重新导入回去。
一开始我是这么做:先查询出学生名单,再使用[table.export](https://table.export)方式把学生名单导出为Excel文件(.xls),导入是直接上传文件到后端,easyExcel解读文件然后batchsave到mysql数据库。导出文件正常,但是传到后台发生了这样的错误:
ERROR | cn.baoye.Controller.Usual_Controller.upload_usualscore() : /Usual_performance/upload_usualscore?course_sn=33&term_sn=1
com.alibaba.excel.exception.ExcelCommonException: Convert excel format exception.You can try specifying the 'excelType' yourself
at com.alibaba.excel.support.ExcelTypeEnum.valueOf(ExcelTypeEnum.java:71)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder.<init>(ReadWorkbookHolder.java:160)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.context.AnalysisContextImpl.<init>(AnalysisContextImpl.java:45)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:44)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:143)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:270)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:293)[easyexcel-2.1.6.jar:]
at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:281)[easyexcel-2.1.6.jar:]
at cn.baoye.Controller.Usual_Controller.upload_usualscore(Usual_Controller.java:195)[file:/D:/baoyeProject/13智慧教育管理平台/edudata/target/classes/:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_333]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_333]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_333]
at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_333]
at com.jfinal.aop.Invocation.invoke(Invocation.java:97)[jfinal-4.9.21.jar:]
at cn.baoye.Interceptor.LoginInterceptor.intercept(LoginInterceptor.java:31)[file:/D:/baoyeProject/13智慧教育管理平台/edudata/target/classes/:]
at com.jfinal.aop.Invocation.invoke(Invocation.java:91)[jfinal-4.9.21.jar:]
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:88)[jfinal-4.9.21.jar:]
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:90)[jfinal-4.9.21.jar:]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)[catalina.jar:9.0.50]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)[catalina.jar:9.0.50]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)[catalina.jar:9.0.50]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)[catalina.jar:9.0.50]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)[catalina.jar:9.0.50]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)[catalina.jar:9.0.50]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)[catalina.jar:9.0.50]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)[catalina.jar:9.0.50]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)[catalina.jar:9.0.50]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)[catalina.jar:9.0.50]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)[tomcat-coyote.jar:9.0.50]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)[tomcat-coyote.jar:9.0.50]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)[tomcat-coyote.jar:9.0.50]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)[tomcat-coyote.jar:9.0.50]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)[tomcat-coyote.jar:9.0.50]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[:1.8.0_333]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)[:1.8.0_333]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)[tomcat-util.jar:9.0.50]
at java.lang.Thread.run(Thread.java:750)[:1.8.0_333]
转换excel格式异常。您可以尝试自己指定“excelType” 那就是传的不是excel文件?
查了很多资料也没有找到原因,要么自己太菜,要么使用的框架太小众,我就自己想办法解决。
然后打开layui导出的excel文件:
尝试另存,发现默认保存类型不是excel的后缀:
另存为.xls/.xlsx文件后导入就正常了,但是我们不能让客户每一次都要另存吧?
所以我换了一个思路:
建立一个excel模板文件,只包含表头,下载模板的时候在后端填入学生名单后,生成excel文件,再返回文件名,前端直接使用[window.location.href]进行下载。
后端:
//excel模板路径
File fi = new File(getSession().getServletContext().getRealPath("download") + "/平时成绩导入模板.xlsx");
//读取excel模板
XSSFWorkbook wb = new XSSFWorkbook(fi);
//读取模板内Sheet1内容
XSSFSheet sheet = wb.getSheet("Sheet1");
//在相应的单元格进行赋值
XSSFRow row;
for (int i=0;i< recordList.size();i++) {
row = sheet.createRow(i+1);
// 第四步,创建单元格,并设置值
row.createCell((short)0).setCellValue(recordList.get(i).getStr("realname"));
row.createCell((short)1).setCellValue(recordList.get(i).getStr("order"));
row.createCell((short)2).setCellValue(recordList.get(i).getStr("upachi1"));
row.createCell((short)3).setCellValue(recordList.get(i).getStr("upachi2"));
row.createCell((short)4).setCellValue(recordList.get(i).getStr("upachi3"));
row.createCell((short)5).setCellValue(recordList.get(i).getStr("upachi4"));
row.createCell((short)6).setCellValue(recordList.get(i).getStr("upachi5"));
row.createCell((short)7).setCellValue(recordList.get(i).getStr("upachi6"));
row.createCell((short)8).setCellValue(recordList.get(i).getStr("upachipe"));
}
try ( //修改模板内容导出新模板
FileOutputStream out = new FileOutputStream(filePath)) {
File file = new File(filePath);
if(file.exists()){//为了保持数据是最新的,先删除同名文件,
file.delete();
}
//导出excel
wb.write(out);
renderJson(Ret.ok().set("code", 0).set("filename",file.getName()));
} catch (Exception e) {
e.getMessage();
}
前端:
$.ajax({
url: './downloadexcel',
data: {
"term_sn":term_sn,
"filename":val,
"course_sn":course_sn,
"class_sn":class_sn
},
datatype:"json",
success: function (result) {
//浏览器A下载
window.location.href='../download/'+result.filename;
}
})
运行测试,OK!
技术小白,只是记录一下遇到问题和自己的解决思路。
更多推荐
已为社区贡献1条内容
所有评论(0)