1 参考模拟代码
public void exportBuilderLicence(String prjNum, HttpServletRequest request, HttpServletResponse response) throws IOException {
//ExportExcelUtil.createXdocreport2(request,response);
ExportPerformanceInfo t = new ExportPerformanceInfo();
t.process(prjNum);
if (t.err != null) {
WebUtil.writeObjectAsJson(response, JsonResult.fail(t.err));
} else {
WebUtil.responseFile(t.outfile, t.returnFileName, response, request);
t.outfile.delete();
}
}
class ExportPerformanceInfo{
String prjNum;
PerformanceDeclarationDetailsDTO perDetailsDTO;
Map<String, Object> detailsDTO2;
File outfile;
String returnFileName;
String err;
void process(String prjNum) {
this.prjNum = prjNum;
// 加载项目
this.loadProjectInfo();
if (err != null){
return;
}
// 生成文档
String now = DateUtil.getNowDateTimeThinStr();
returnFileName = "XXXX-" + perDetailsDTO.getInfoReq().getPrjName() + "-" + now + ".docx";
outfile = new File("./tmp/export_project_" + prjNum + "-" + now + ".docx");
if (!outfile.getParentFile().exists()) {
outfile.getParentFile().mkdirs();
}
Resource resource = new ClassPathResource("document/陕西导出模板-业绩申报-20231221A.docx");
try(InputStream is = resource.getInputStream();
XWPFDocument doc = new XWPFDocument(is);) {
this.renderDoc(doc);
PoiWordUtil.write(doc, outfile);
} catch(Exception e) {
log.warn("导出失败", e);
err = "导出失败";
return;
}
if (err != null){
return;
}
}
void loadProjectInfo() {
// 获取数据 并处理数据
PerformanceDeclarationDetailsDTO perData = viewPerformanceDeclarationDetails(prjNum);
if (perData == null) {
err = "项目不存在";
return;
}
perData.getInfoReq().setIsMajorName(Short.valueOf("0").equals(perData.getInfoReq().getIsMajor())?"否":"是");
perData.getInfoReq().setPrjApprovalDateString(DateUtil.formatAsDate(perData.getInfoReq().getPrjApprovalDate()));
for(ProjectCensorInfoReq censorInfoReq : perData.getCensorInfoReqs()){
censorInfoReq.setOneCensorIsPassName(Short.valueOf("0").equals(censorInfoReq.getOneCensorIsPass())?"否":"是");
censorInfoReq.setCensorEdateString(DateUtil.formatAsDate(censorInfoReq.getCensorEdate()));
}
this.perDetailsDTO = perData;
}
void renderDoc(XWPFDocument doc) {
// 段落处理
for (XWPFParagraph p : doc.getParagraphs()) {
PoiWordUtil.renderParagraphVars(p, perDetailsDTO.getInfoReq());
//System.out.println(p.getText());
}
// 表格处理
for (XWPFTable tb : doc.getTables()) {
String title = PoiWordUtil.getTblCaption(tb);
//多模板构建 renderTableData3 表单 renderTableData1 列表
if ("基本信息表".equals(title)) {
PoiWordUtil.renderTableData3(tb, BeanUtil.beanToMap(perDetailsDTO.getInfoReq()));
}
else if ("项目信息表".equals(title)) {
PoiWordUtil.renderTableData1(tb, perDetailsDTO.getUnitInfoReqs());
}
else if ("工程信息表".equals(title)) {
PoiWordUtil.renderTableData1(tb, perDetailsDTO.getProjectCostInfoReqs());
}
}
}
}
2 相关扩展代码
public static void excel(InputStream resourceAsStream,
String fileName,
List data,
HttpServletResponse response) {
try {
ServletOutputStream out = response.getOutputStream();
//设置文件类型
response.setContentType("application/vnd.ms-excel");
//设置编码格式
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
//创建excel
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(resourceAsStream).build();
// 创建sheet
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(data, fillConfig, writeSheet);
//填充完成
excelWriter.finish();
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
3 相关扩展代码
/**
* 设置文件下载的文件名,防止中文乱码
*/
public void setHeader(HttpServletRequest request, HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
String userAgent = request.getHeader("User-Agent");
if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Trident") ||
StringUtils.contains(userAgent, "Edge")){ //解决IE中文名称乱码
fileName = URLEncoder.encode(fileName,"UTF8");
}else {//火狐和其他浏览器中文名乱码
fileName = new String(fileName.getBytes("utf8"), "ISO8859-1");
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;" + " filename=\""+fileName+"\"");
}
4模板样式
5模板样式2