java导出word文档乱码(导出word文档案例)

时刻小站 206

无疫情学校要开展线下教学无疫情的地方也恢复到正常的生活,所以今天也要正常增加新的知识。

java导出文件是每个系统必不可少的,导出一般会导出文件或者excel表格,以导出excel表格为例:

一:自定义导出

第一:controller层

value中的名字是自定义的,在controller层写之前要建好query和service层和vo层,如果不知道上述是什么意思,请再学习一下springMvc ,在这就不一一赘述。

@PostMapping(value ="expoet")@ApiOperation(value ="导出", notes ="导出", produces = MediaType.APPLICATION_JSON_VALUE)
public void export(@RequestBodyTestQuery query, HttpServletResponse response) throws IOException {TestService.export(query, response);
}

第二:service层里的方法

/**
*
*导出
*
**/voidexport(TestQuery query, HttpServletResponse response)throws IOException;

​第三:impl层

实体类,在这用到的 getExcelOutputStream()是自己封装的方法,后面加文件名和格式

@Overridepublic void export(TestQuery query, HttpServletResponse response) throws IOException {//设置返回文件名称和格式getExcelOutputStream("导出表", response);if(CollectionUtils.isNotEmpty(query)) {try(OutputStream outputStream = response.getOutputStream()) {EasyExcel.write(outputStream, TestVo.class).sheet("导出表").doWrite(query);
}catch(IOException e) {thrownewRuntimeException(e);
}
}
}

第四:getExcelOutputStream()方法,主要解决用utf-8返回防止乱码

/**
* 导出文件时为Writer生成OutputStream
*@paramfileName: 文件名称
*@paramresponse:
*/publicstaticvoidgetExcelOutputStream(String fileName,
HttpServletResponse response)throwsIOException{try{
fileName = URLEncoder.encode(fileName,"UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-Disposition","attachment; filename="+ fileName +".xlsx");
response.setHeader("Pragma","public");
response.setHeader("Cache-Control","no-store");
response.addHeader("Cache-Control","max-age=0");// response.setHeader("content-Type", "application/vnd.ms-excel");}catch(IOException e) {thrownewIOException("导出excel表格失败!", e);
}
}

第五:vo层 这里是自定义的实体类(TestVo),导出的字段要加一个注释

@ExcelProperty(value ="名称")privateString name;

​这样用postman调用就可以生成excel表格了。

二:用固定模板导出

此方法是先在minio上导入excel模板,之后再nacos上导入url;

(这块主要讲代码的开发)

第一,第二步还是新建controller层 和 一.1/一.2一样

第三:impl层,写具体的实现类,exportRecycleReords()是要得出的结果,比如要输出哪个字段,或者求和之类的都在此方法中写。尤其要说明一下reportUrl是在nacos上导入的url的自命名。记得在方法的上面引入此Url

@Value("${global.import_file.reportUrl:}")privateString reportUrl;@OverridepublicvoidexportRecycle(HttpServletResponse response, BsRecycleRecordsQuery query){
List recycleRecordsVoList = exportRecycleReords(query);try(InputStream excelInputStream = HttpUtil.getExcelInputStream(reportUrl);) {
HttpUtil.getExcelOutputStream("记录", response);//设置输出流和模板信息ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(excelInputStream).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为trueFillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(recycleRecordsVoList, fillConfig, writeSheet);
excelWriter.finish();
}catch(IOException e) {thrownewBusinessException("获取导出模版失败");
}
}

这样就可以根据模板导出了 ,模板使用于财务报表之类的字段繁多且麻烦的表格。

上一篇:

下一篇:

  同类阅读

分享