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>
这是默认生成的水印