核心
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
使用该包实现 word 文件填充,同时支持 pdf、excel 格式
步骤
word模板文件存放在项目 resource 文件夹下
- 需要填充的数据封装到 Map
- 获取模板文件
- 填充模板
- 将填充后的 word 临时保存到本地
- 获取保存的临时文件转换成 Byte[ ]
- 上传到公司文件服务器
- 返回的文件下载预览地址透传给前端
代码实现
public FileDTO createNoticeLetter(NoticeCondition condition) {
FileDTO res = null;
// 封装填充数据
Map philipp = getMap(condition);
FileInputStream tempFile = null;
InputStream inputStream = null;
// 临时存储文件
String uuid = UUID.randomUUID().toString();
String tmpdir = uuid + ".docx";
try {
// 获取 resource 下的模板文件
ClassPathResource classPathResource = new ClassPathResource("/docx-template/bankTemplate.docx");
inputStream = classPathResource.getInputStream();
log.info("获取模板文件输入流");
// 设置变量内容
WordprocessingMLPackage template = WordprocessingMLPackage.load(inputStream);
// 填充模板文件
Docx4JSRUtil.searchAndReplace(template, philipp);
FileOutputStream outputStream = new FileOutputStream(new File(tmpdir),true);
template.save(outputStream);
outputStream.flush();
log.info("模板文件填充完成{}", condition.getPolicyId());
//获取本地文件
tempFile = new FileInputStream(tmpdir);
// 转换成 byte[]
byte[] content = readInputStream(tempFile);
// 上传到文件服务器
res = Optional.ofNullable(ArrayUtils.toObject(content))
.orElseThrow(() -> new ServiceException("查询失败"));
} catch (Exception e) {
log.error("模板下载失败", e);
} finally {
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
log.error("模板下载失败", e);
}
}
if (tempFile != null) {
try {
tempFile.close();
// 删除本地临时文件
File file = new File(tmpdir);
if(file.delete()){
log.info(file.getName() + " 文件已被删除!");
}else{
log.info(file.getName() + " 文件删除失败!");
}
} catch (IOException e) {
log.error("文件上传失败", e);
}
}
}
return res;
}
/**
* 数据封装
*/
private Map getMap(NoticeCondition condition){
Map<String, String> philipp = Maps.<String, String>builder().put("${name}", "panda").build();
return philipp;
}
/**
* 从输入流中获取字节数组
*/
private static byte[] readInputStream(FileInputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}