当前位置: 首页> 文旅> 旅游 > Java使用XWPFTemplate将word填充数据,并转pdf

Java使用XWPFTemplate将word填充数据,并转pdf

时间:2025/7/9 3:43:33来源:https://blog.csdn.net/weixin_44928129/article/details/139531848 浏览次数:0次

poi-tl

poi-tl(poi template language)是基于Apache POI的Word模板引擎。纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。

主要处理区域有这么几个模块:

依赖

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.0.0</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>

1、基本介绍

1.1、 根据文件路径、文件、文件流几种方式获取XWPFTemplate

//文件路径
XWPFTemplate template = XWPFTemplate.compile(wordtemplate).render(datas);//文件
File wordtemplate = new File(inDocxFilePath);
XWPFTemplate template = XWPFTemplate.compile(wordtemplate).render(datas);//文件流
InputStream wordtemplate = new FileInputStream(inDocxFilePath);
XWPFTemplate template = XWPFTemplate.compile(wordtemplate).render(datas);

1.2、生成到文件路径或者是流

//生成到文件路径
template.writeToFile(outFilePath);
template.close();//生成到流
FileOutputStream out = new FileOutputStream(wordoutprint);
template.write(out);
out.flush();//关闭资源
out.close();
template.close();

修改变量 为 ${var}

File inDocxFile = new File(inDocxFilePath);
Configure configure = Configure.newBuilder().buildGramer("${", "}").build();
XWPFTemplate template = XWPFTemplate.compile(inDocxFile, configure).render(map);

2、模板

2.1、文本、对象

TextRenderData、HyperLinkTextRenderData

Map<String, Object> map = new HashMap<>();// 1、普通字符map.put("word", "helloWord");//2、配置格式Style style = StyleBuilder.newBuilder().buildColor("00FF00").buildBold().build();map.put("author", new TextRenderData("HealerJean", style));//3、超链接map.put("website", new HyperLinkTextRenderData("website.", "http://www.baidu.com"));//制作模板XWPFTemplate template = XWPFTemplate.compile(wordtemplate).render(map);//开始生成新的wordFileOutputStream outputStream = new FileOutputStream(outDocxFilePath);template.write(outputStream);outputStream.flush();//关闭资源outputStream.close();template.close();

2.2、图片

PictureRenderData

String imagePath = "D:/pdf/image.png";Map<String, Object> map = new HashMap<>();// 本地图片map.put("localPicture", new PictureRenderData(120, 120, imagePath));// 图片流文件InputStream inputStream = new FileInputStream(imagePath);map.put("localBytePicture", new PictureRenderData(100, 120, ".png", inputStream));// 网络图片map.put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlBufferedImage("https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/assets/img/tctip/weixin.j跑pg")));// java 图片BufferedImage bufferImage = ImageIO.read(new FileInputStream(imagePath));map.put("bufferImagePicture", new PictureRenderData(100, 120, ".png", bufferImage));//如果希望更改语言前后缀为 ${var}Configure builder = Configure.newBuilder().buildGramer("${", "}").build();XWPFTemplate template = XWPFTemplate.compile(inDocxFilePath, builder).render(map);//开始生成新的wordtemplate.writeToFile(outDocxFilePath);template.close();

2.3、表格

MiniTableRenderData

Map<String, Object> map = new HashMap<>();Table table1 = new Table("11", "12", "13");Table table2 = new Table("21", "22", "23");List<Table> table = new ArrayList<>();table.add(table1);table.add(table2);// RowRenderData header = RowRenderData.build("one", "two", "three");//使用样式Style style = StyleBuilder.newBuilder().buildColor("00FF00").buildBold().build();RowRenderData header = RowRenderData.build(new TextRenderData("one", style), new TextRenderData("two"), new TextRenderData("three"));List<RowRenderData> tableBody = new ArrayList<>();for (Table item : table) {RowRenderData row = RowRenderData.build(item.getOne(), item.getTwo(), item.getThree());tableBody.add(row);}map.put("table", new MiniTableRenderData(header, tableBody));Configure builder = Configure.newBuilder().buildGramer("${", "}").build();XWPFTemplate template = XWPFTemplate.compile(inDocxFilePath, builder).render(map);template.writeToFile(outDocxFilePath);template.close();

2.4、列表模板

NumbericRenderData

Map<String, Object> map = new HashMap<>();map.put("unorderlist", new NumbericRenderData(new ArrayList<TextRenderData>()));map.put("orderlist", new NumbericRenderData(NumbericRenderData.FMT_DECIMAL, new ArrayList<TextRenderData>()));//如果希望更改语言前后缀为 ${var}Configure builder = Configure.newBuilder().buildGramer("${", "}").build();XWPFTemplate template = XWPFTemplate.compile(inDocxFilePath, builder).render(map);template.writeToFile(outDocxFilePath);template.close();

3、配置

ConfigureBuilder builder = Configure.newBuilder();
XWPFTemplate.compile("~/template.docx", builder.buid());

3.1、图片语法@修改为%

builder.addPlugin('%', new PictureRenderPolicy());

3.2、语法加前缀 为${var}

builder.buildGramer("${", "}");

3.3、模板标签设置正则表达式规则

模板标签支持中文、字母、数字、下划线的组合,比如,我们可以通过正则表达式来配置标签的规则,比如不允许中文:

builder.buildGrammerRegex("[\\w]+(\\.[\\w]+)*");

下面为我在工作中的应用:

生成word:

Map<String, Object> datas = new HashMap<String, Object>() {
{
//时间
put("year", year);
put(pNames[j] + "_" + vNames[j] + "_img_zhpf_4", new PictureRenderData(500, 300, pyhon_img_path + pNames[j] + "_" + vNames[j].replace("_", "-") + "_" + "comprehensive_score_" + element + "_4.png"));
}
};
XWPFTemplate template = XWPFTemplate.compile(wordtemplate).render(datas);
FileOutputStream out = new FileOutputStream(wordoutprint);
template.write(out);
out.flush();
out.close();
template.close();

转pdf:

public static boolean getLicense() {boolean result = false;try {File directory = new File("");// 参数为空String courseFile = directory.getCanonicalPath();//获取项目根目录
//            File file = new File("/temp/qh_assess/java_pro/config/license.xml"); // 新建一个空白pdf文档File file = new File(courseFile + "/config/license.xml"); // 新建一个空白pdf文档InputStream is = new FileInputStream(file); // license.xml找个路径放即可。License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}public static boolean doc2pdf(String inPath, String outPath) {if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生return false;}try {long old = System.currentTimeMillis();File file = new File(outPath); // 新建一个空白pdf文档FileOutputStream os = new FileOutputStream(file);Document doc = new Document(inPath); // Address是将要被转化的word文档doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,// EPUB, XPS, SWF 相互转换long now = System.currentTimeMillis();System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时} catch (Exception e) {e.printStackTrace();}return true;}

license.xml

<?xml version="1.0" encoding="UTF-8" ?>
<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

这是默认生成的水印

关键字:Java使用XWPFTemplate将word填充数据,并转pdf

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: