今天遇到一个问题,使用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!

技术小白,只是记录一下遇到问题和自己的解决思路。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐