日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Java结合EasyExcel,模板文件填充并导出Excel】

發(fā)布時間:2024/1/18 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java结合EasyExcel,模板文件填充并导出Excel】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

需求描述:

客戶網(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ù)是都會重新生成一行空行,此選項(xiàng)默認(rèn)是關(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ù)庫的實(shí)體類 不需要加特殊的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)驗(yàn)決定了你的實(shí)力,自己還是太嫩,路漫漫其修遠(yuǎn)兮...

另外我發(fā)現(xiàn)我用postman居然測不成功,最后用swagger才能返回一個下載鏈接,無語。。。

這件事給我的啟發(fā)是,不要新高氣傲覺得一切OK的樣子,實(shí)際上如果網(wǎng)上沒有一些開源代碼,自己是很難順利完成某個業(yè)務(wù)的編寫,還是要對技術(shù)保持敬畏,自己平時要學(xué)會復(fù)盤和總結(jié),爭取不會被同一個問題難倒兩次。另外還要感謝為我們開路的大佬,正所謂前人種樹,后人乘涼,respect!

總結(jié)

以上是生活随笔為你收集整理的【Java结合EasyExcel,模板文件填充并导出Excel】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。