需求描述:
客戶網(wǎng)頁上填一個Excel表格,數(shù)據(jù)存到數(shù)據(jù)庫,這個導出接口要做的就是從數(shù)據(jù)庫中的獲取數(shù)據(jù)并填充到模板文件,最后通過response返給前端一個下載鏈接,用戶即可獲取填充好的Excel文件。
方案一:
一開始使用的是easypoi,發(fā)現(xiàn)當填充一行數(shù)據(jù)時是OK的,但是如果是多行數(shù)據(jù),處理對象集合會拋異常,所以在小組長的建議下最終放棄選擇使用EasyExcel;
方案二:
組長給了個圖示 直接看懂 如下兩圖:
?模糊的數(shù)據(jù)是模板數(shù)據(jù)不用關(guān)注,目的是往空格里填充數(shù)據(jù)
?左邊模板,右邊結(jié)果,一目了然,我覺得挺簡單寫了個demo也成功了(文件生成在本地)
后面我想著網(wǎng)上找找樣例,把輸出流設(shè)置到response里面應該不難,我自己寫好了調(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 = "導出", notes = "導出", 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);
}
@Override
public 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è)置為true
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
List<ReportDetailExcelDTO>list=OrikaHelper.convertList(reportDetailDOS, ReportDetailExcelDTO.class);
excelWriter.fill(list, fillConfig, writeSheet);
excelWriter.finish();
}
用戶導出過度的類如下:
@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ù)對象的泛型 相當于數(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ù)代碼寫了幾行然后云淡風輕告訴我可以了,我當時真的很不理解,心情很復雜,一方面覺得自己為什么搞不出來,另外覺得像改變版本這種問題真的很難找到排查出來,經(jīng)歷這件事讓我覺得,同樣是程序員,有的人還在埋頭苦苦調(diào)試找原因,有的人輕而易舉的可以找到問題并修改,閱歷和經(jīng)驗決定了你的實力,自己還是太嫩,路漫漫其修遠兮...
另外我發(fā)現(xiàn)我用postman居然測不成功,最后用swagger才能返回一個下載鏈接,無語。。。文章來源:http://www.zghlxwxcb.cn/news/detail-709248.html
這件事給我的啟發(fā)是,不要新高氣傲覺得一切OK的樣子,實際上如果網(wǎng)上沒有一些開源代碼,自己是很難順利完成某個業(yè)務(wù)的編寫,還是要對技術(shù)保持敬畏,自己平時要學會復盤和總結(jié),爭取不會被同一個問題難倒兩次。另外還要感謝為我們開路的大佬,正所謂前人種樹,后人乘涼,respect!文章來源地址http://www.zghlxwxcb.cn/news/detail-709248.html
到了這里,關(guān)于【Java結(jié)合EasyExcel,模板文件填充并導出Excel】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!