解决方法:在模板的位置定义参数如 {{name}} {{age}}等等,使用 poi 处理
伪代码:
@PostMapping("/practiceAppr")
public AjaxResult practiceAppr(OutputStream outputStream, @RequestBody ExportToExcelParamDto paramDto) {
//查询数据 ExportToWordByPracticeApprDto 为定义的模板中的参数
ExportToWordByPracticeApprDto app= baseService.practiceApprExport(paramDto);
try {
//获取模板文件
try (InputStream is = TrActivityGroupServiceImpl.class.getClassLoader().getResourceAsStream("word/导出模板A4.docx")
) {
try (XWPFDocument doc = new XWPFDocument(is)
) {
Map<String, Object> replaceMap = BeanUtil.beanToMap(app);
Map<String, Object> resultMap = new HashMap<>();
//word中的占位符格式是{{}}
replaceMap.forEach((placeholder, replacement) -> resultMap.put("{{" + placeholder + "}}", replacement));
//处理文件替换参数为实际值
replacePlaceholders(doc, resultMap);
doc.write(outputStream);
outputStream.close();
is.close();
}
}
} catch (Exception e) {
logger.error("文件导出错误{}", e.getMessage());
}
return null;
}
private void replacePlaceholders(XWPFDocument document, Map<String, Object> placeholders) throws IOException, InvalidFormatException {
//处理普通word文字 不包含表格
for (XWPFParagraph paragraph : document.getParagraphs()) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
for (Map.Entry<String, Object> entry : placeholders.entrySet()) {
if (text.contains(entry.getKey())) {
text = text.replace(entry.getKey(), entry.getValue() != null ? (String) entry.getValue() : "");
run.setText(text, 0);
}
}
}
}
}
// 处理替换表格中的占位符
for (XWPFTable table : document.getTables()) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph paragraph : cell.getParagraphs()) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
for (Map.Entry<String, Object> entry : placeholders.entrySet()) {
if (text.contains(entry.getKey())) {
//获取、处理图片略
...
...
int format = XWPFDocument.PICTURE_TYPE_PNG;
//图片地址
BufferedImage image = ImageIO.read(new URL(value));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//suffix为图片的后缀 .png
ImageIO.write(image, suffix, outputStream);
byte[] imageBytes = outputStream.toByteArray();
//后两个参数是宽高
run.addPicture(new ByteArrayInputStream(imageBytes), format, fileName, Units.toEMU(80), Units.toEMU(40));
//替换文字 图片和文字如果都展示
text = text.replace(entry.getKey(), entry.getValue() != null ? (String) entry.getValue() : "");
run.setText(text, 0);
}
}
}
}
}
}
}
}
}
原文地址:https://blog.csdn.net/qq_29958413/article/details/134531381
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7601.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。