【Java结合EasyExcel,模板文件填充并导出Excel】
需求描述:
客戶網(wǎng)頁上填一個Excel表格,數(shù)據(jù)存到數(shù)據(jù)庫,這個導(dǎo)出接口要做的就是從數(shù)據(jù)庫中的獲取數(shù)據(jù)并填充到模板文件,最后通過response返給前端一個下載鏈接,用戶即可獲取填充好的Excel文件。
方案一:
一開始使用的是easypoi,發(fā)現(xiàn)當(dāng)填充一行數(shù)據(jù)時是OK的,但是如果是多行數(shù)據(jù),處理對象集合會拋異常,所以在小組長的建議下最終放棄選擇使用EasyExcel;
方案二:
組長給了個圖示 直接看懂 如下兩圖:
?模糊的數(shù)據(jù)是模板數(shù)據(jù)不用關(guān)注,目的是往空格里填充數(shù)據(jù)
?左邊模板,右邊結(jié)果,一目了然,我覺得挺簡單寫了個demo也成功了(文件生成在本地)
后面我想著網(wǎng)上找找樣例,把輸出流設(shè)置到response里面應(yīng)該不難,我自己寫好了調(diào)試卻發(fā)現(xiàn)一直報錯,各種改都不行,我調(diào)試+修改搞了一上午,后面我跟組長匯報了情況,他說他來改,半小時就改好了。
我寫的代碼是這樣的:
<!--EasyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency> @GetMapping("/exportExcel")@ApiOperation(value = "導(dǎo)出", notes = "導(dǎo)出", httpMethod = "GET")@ApiImplicitParams(value = {@ApiImplicitParam(name = "code", paramType = "query", value = "單位編碼", required = true, dataType = "String", example = "12312311")})public void exportExcel(@RequestParam String code, HttpServletResponse response)throws Exception {reportService.exportExcel(code, response);} @Overridepublic void exportExcel(String code, HttpServletResponse response) throws Exception{//先查詢詳情列表是否存在List<ReportDetailDO> reportDetailDOS = reportDetailDAO.select(ReportDetailDO.builder().code(code).build());//不存在時拋異常——未查詢到填報記錄if (CollectionUtils.isEmpty(reportDetailDOS)) {throw new BusException(ResultEnum.NO_FILLED_IN_RECORDS_FOUND);}ReportOrgDO reportOrgDO = reportOrgDAO.selectOne(ReportOrgDO.builder().code(code).build());String templateFileName = "template/vnd.xlsx";// 這里URLEncoder.encode可以防止中文亂碼String fileName = URLEncoder.encode(reportOrgDO.getName() + TABLE_NAME+".xlsx", "UTF-8").replaceAll("\\+", "%20");//文件名=公司名+表名response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));ServletOutputStream outputStream = response.getOutputStream();InputStream templateFile = this.getClass().getClassLoader().getResourceAsStream(templateFileName);ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();//開啟自動換行,自動換行表示每次寫入一條list數(shù)據(jù)是都會重新生成一行空行,此選項默認是關(guān)閉的,需要提前設(shè)置為trueFillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List<ReportDetailExcelDTO>list=OrikaHelper.convertList(reportDetailDOS, ReportDetailExcelDTO.class); excelWriter.fill(list, fillConfig, writeSheet);excelWriter.finish();}用戶導(dǎo)出過度的類如下:
@Data @NoArgsConstructor @AllArgsConstructor @ApiModel("匯報詳情Excel") public class ReportDetailExcelDTO {@ExcelProperty("2019年度")private String content1;@ExcelProperty("2020年度")private String content2;@ExcelProperty("2021年度")private String content3;@ExcelProperty("2022年度")private String content4;@ExcelProperty("備注")private String remark; }組長是這樣寫的:
<!--EasyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency> //省略獲取數(shù)據(jù)對象集合的方法。。。(list)String templateFileName = "template/vnd.xlsx";// 這里URLEncoder.encode可以防止中文亂碼String fileName = URLEncoder.encode(reportOrgDO.getName() + TABLE_NAME + ".xlsx", "UTF-8").replaceAll("\\+", "%20");//文件名=公司名+表名response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));//ReportDetailDO是數(shù)據(jù)對象的泛型 相當(dāng)于數(shù)據(jù)庫的實體類 不需要加特殊的EasyExcel注解InputStream templateFile = this.getClass().getClassLoader().getResourceAsStream(templateFileName);EasyExcel.write(response.getOutputStream(), ReportDetailDO.class).withTemplate(templateFile).sheet().doFill(Optional.ofNullable(list).orElse(new ArrayList<>()));組長簡簡單單改了下依賴的版本,業(yè)務(wù)代碼寫了幾行然后云淡風(fēng)輕告訴我可以了,我當(dāng)時真的很不理解,心情很復(fù)雜,一方面覺得自己為什么搞不出來,另外覺得像改變版本這種問題真的很難找到排查出來,經(jīng)歷這件事讓我覺得,同樣是程序員,有的人還在埋頭苦苦調(diào)試找原因,有的人輕而易舉的可以找到問題并修改,閱歷和經(jīng)驗決定了你的實力,自己還是太嫩,路漫漫其修遠兮...
另外我發(fā)現(xiàn)我用postman居然測不成功,最后用swagger才能返回一個下載鏈接,無語。。。
這件事給我的啟發(fā)是,不要新高氣傲覺得一切OK的樣子,實際上如果網(wǎng)上沒有一些開源代碼,自己是很難順利完成某個業(yè)務(wù)的編寫,還是要對技術(shù)保持敬畏,自己平時要學(xué)會復(fù)盤和總結(jié),爭取不會被同一個問題難倒兩次。另外還要感謝為我們開路的大佬,正所謂前人種樹,后人乘涼,respect!
總結(jié)
以上是生活随笔為你收集整理的【Java结合EasyExcel,模板文件填充并导出Excel】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双系统设置成默认启动Windows的问题
- 下一篇: ,,,,,,,,