背景介绍 最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有excel的第二个sheet上。考虑到数据量还比较大,干脆引入阿里的EasyExcel来做。 下面我先上最终代码,再来说说我遇到的坑有哪些代码实战 引入依赖dependencygroupIdcom。alibabagroupIdeasyexcelartifactIdversion3。1。2versiondependency 代码:publicStringdoHandle(){try(ByteArrayOutputStreamoutputStreamnewByteArrayOutputStream();com。alibaba。excel。ExcelWriterexcelWriterEasyExcel。write(outputStream)。build()){ListSaleTransferSummaryRateExportVoexportVosqueryAction。querySummaryExport();ListSaleTransferClassRateExportVoexportRateVosqueryAction。queryClassRate();WriteSheetwriteSheetEasyExcel。writerSheet(0,统计)。head(SaleTransferSummaryRateExportVo。class)。build();excelWriter。write(exportVos,writeSheet);WriteSheetrateWriteSheetEasyExcel。writerSheet(1,明细)。head(SaleTransferClassRateExportVo。class)。build();excelWriter。write(exportRateVos,rateWriteSheet);excelWriter。close();数据落地到OSSStringresultPathossClient。uploadFile(outputStream。toByteArray(),ContentMediaEnum。XLSX。getName(),FileExtEnum。XLSX。getName());returnresultPath;}catch(Exceptione){return;}} 我们项目是将文件传到oss,然后去oss进行下载。也可以直接写入到文件或responsepublicvoiddoHandle(){FilefilenewFile();try(com。alibaba。excel。ExcelWriterexcelWriterEasyExcel。write(file)。build()){ListSaleTransferSummaryRateExportVoexportVosqueryAction。querySummaryExport();ListSaleTransferClassRateExportVoexportRateVosqueryAction。queryClassRate();WriteSheetwriteSheetEasyExcel。writerSheet(0,统计)。head(SaleTransferSummaryRateExportVo。class)。build();excelWriter。write(exportVos,writeSheet);WriteSheetrateWriteSheetEasyExcel。writerSheet(1,明细)。head(SaleTransferClassRateExportVo。class)。build();excelWriter。write(exportRateVos,rateWriteSheet);}catch(Exceptione){log。error(导出异常,e);}} 只需要修改write的参数即可。 主要的代码就完成了,那么数据的属性和excel列名称怎么对应上的呢? 在数据的实体类上加上ExcelProperty注解就行了。它就能自动创建列头,并将数据对应写入。ColumnWidth列宽度ExcelIgnore代表不用导出的属性DateTimeFormat日期格式化publicclassSaleTransferSummaryRateExportVo{ExcelProperty(老师昵称)ColumnWidth(10)privateStringteacherName;ExcelProperty(大区)privateStringregionName;ExcelProperty(小组)privateStringgroupName;ExcelProperty(创建时间)DateTimeFormat(yyyyMMdd)privateDatecreateTime;} 写完之后觉得表格有点丑,于是又调了下样式。也是几个注解搞定HeadStyle(fillPatternTypeFillPatternTypeEnum。SOLIDFOREGROUND,fillForegroundColor44)HeadFontStyle(fontHeightInPoints10)ContentFontStyle(fontHeightInPoints10)publicclassSaleTransferSummaryRateExportVo{ExcelProperty(老师昵称)privateStringteacherName;ExcelProperty(大区)privateStringregionName;ExcelProperty(小组)privateStringgroupName;ExcelProperty(创建时间)DateTimeFormat(yyyyMMdd)privateDatecreateTime;} fillForegroundColor的值就代表颜色,具体什么值代表什么颜色,可以参考IndexedColors枚举类。 就这样就完成了。导出效果图如下: 遇到的坑 1、版本问题 我最开始用的版本是这样的,因为项目里之前就引入了poidependencygroupIdorg。apache。poigroupIdpoiooxmlartifactIdversion3。17versiondependencydependencygroupIdcom。alibabagroupIdeasyexcelartifactIdversion3。1。2versiondependency 版本不对的时候写入直接报错。 异常信息如下:Exceptioninthreadmaincom。alibaba。excel。exception。ExcelGenerateException:java。lang。NoSuchMethodError:org。apache。poi。ss。usermodel。Cell。setCellValue(LjavatimeLocalDateTime;)Vatcom。alibaba。excel。write。ExcelBuilderImpl。addContent(ExcelBuilderImpl。java:65)atcom。alibaba。excel。ExcelWriter。write(ExcelWriter。java:70)atcom。alibaba。excel。ExcelWriter。write(ExcelWriter。java:47)atcn。jojo。sales。app。task。ExportSalesTransferSummaryTask。main(ExportSalesTransferSummaryTask。java:90)Causedby:java。lang。NoSuchMethodError:org。apache。poi。ss。usermodel。Cell。setCellValue(LjavatimeLocalDateTime;)Vatcom。alibaba。excel。write。executor。AbstractExcelWriteExecutor。converterAndSet(AbstractExcelWriteExecutor。java:95)atcom。alibaba。excel。write。executor。ExcelWriteAddExecutor。addJavaObjectToExcel(ExcelWriteAddExecutor。java:174)atcom。alibaba。excel。write。executor。ExcelWriteAddExecutor。addOneRowOfDataToExcel(ExcelWriteAddExecutor。java:82)atcom。alibaba。excel。write。executor。ExcelWriteAddExecutor。add(ExcelWriteAddExecutor。java:58)atcom。alibaba。excel。write。ExcelBuilderImpl。addContent(ExcelBuilderImpl。java:59)。。。3more 2、excelWriter要关闭excelWriter。close(); 我之前因为excelWriter的定义是是写在try里的,所以没有close,但是我的用法又是将excelWriter写入到字节流,然后字节流传到oss,而且这个步骤也是在try里面。就导致了我一直写入不成功,后来才发现,浪费了一点时间。