maven的pom.xml配置增加:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.6.7</version>
</dependency>
java代码编写:
/** word模板路径 **/
@Value("${file.upload.templatePath}")
private String templatePath;
/** 文件上传路径 **/
@Value("${file.upload.path}")
private String path;
@RequestMapping("exportBookWord")
public void exportBookWord(@RequestBody StandingBookDTO dto, HttpServletResponse response) {
baseBiz.exportBookWord(dto, response);
}
public void exportBookWord(StandingBookDTO dto, HttpServletResponse response) {
PageHelper.startPage(0, 500);
List<Map> books = standingBookMapper.pageBookWord(dto);
CustomExcelUtil excelUtil = new CustomExcelUtil();
books.stream().forEach(book -> {
if (StrUtil.isNotBlank(Convert.toStr(book.get("inPhotoUrl")))) {
book.put("inPhotoUrl", excelUtil.getPic(Convert.toStr(book.get("inPhotoUrl")), path));
} else {
book.put("inPhotoUrl", "");
}
if (StrUtil.isNotBlank(Convert.toStr(book.get("outPhotoUrl")))) {
book.put("outPhotoUrl", excelUtil.getPic(Convert.toStr(book.get("outPhotoUrl")), path));
} else {
book.put("outPhotoUrl", "");
}
if (StrUtil.isNotBlank(Convert.toStr(book.get("drivingFileFrontJson")))) {
book.put("drivingFileFrontUrl", excelUtil.getPic(Convert.toStr(book.get("drivingFileFrontJson")), path));
} else {
book.put("drivingFileFrontUrl", "");
}
//货物状态 0: 正常开单; 1: 退货单据
if (StrUtil.isNotBlank(Convert.toStr(book.get("cargoState")))) {
Integer cargoState = Convert.toInt(Convert.toStr(book.get("cargoState")));
book.put("cargoState", cargoState == 0 ? "正常开单" : cargoState == 1 ? "退货单据" : "");
} else {
book.put("cargoState", "");
}
});
Map<String, Object> resultMap = new HashMap(8);
resultMap.put("startTime", dto.getStartTime());
resultMap.put("endTime", dto.getEndTime());
resultMap.put("list", books);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder().useSpringEL().bind("standingBook", policy).build();
try (ServletOutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
//读取模板的文件流,并用datas替换模板标签,填充数据使用XWPFTemplate类的render(Map<String, Object> data)方法,将数据填充到模板中。其中,data参数是一个Map类型,表示占位符对应的实际数据。
XWPFTemplate template = XWPFTemplate.compile(new File(templatePath + "/standingBookTemplate.docx"), config).render(resultMap);
//XWPFTemplate template = XWPFTemplate.compile(new File("H:\\template\\templates\\standingBookTemplate.docx"), config).render(resultMap);
) {
String filename = "运输台账列表.docx";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//输出word文件流,输出后关闭流
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
} catch (IOException e) {
log.error("导出运输台账信息失败");
log.error(e.getMessage(), e);
}
}
public class CustomExcelUtil extends ExcelUtil {
public String getPic(String basePic,String path) {
//取出第一张图片
JSONArray parse = (JSONArray) JSONArray.parse(basePic);
JSON json = (JSON) parse.get(0);
Map map = json.toJavaObject(Map.class);
String filePath = String.valueOf(map.get("filePath"));
if (StringUtils.isNotBlank(filePath)) {
filePath = filePath.replace("preview/", "");
}
return path + "/upload/" + filePath;
}
}
application.xml配置:
file:
upload:
path: /usr/local
templatePath: /usr/local/java_server/upload/wordTemplate
size: 52428800
这个word模板起名为standingBookTemplate.docx,word模板格式语法如下所示:
vue代码如下:
<el-button type="primary" size="mini" class="com-button width80 marginL10" v-hasPerm="'export'" @click="handleExport">导 出</el-button>
handleExport() {
let params = JSON.parse(JSON.stringify(this.queryParam));
params['extendValue'] = this.extendValue;
delete params.page;
delete params.limit;
params.fileName = '台账列表';
exportObj(params).then(res => {
this.$fileDownload(res, params.fileName + '.docx');
});
},
export function exportObj(data) {
return fetch({
url: '/standingBook/exportBookWord',
method: 'POST',
responseType: 'blob', // 下载文件必须有这个类型
data
});
}
最后导出word效果如下所示: