下面是一个简单的例子,展示了如何根据一个包含占位符${name}
的.docx
模板文件,将其渲染为具体的值李丽丽
,并确保中文字符能够正确显示:
import org.apache.poi.xwpf.usermodel.XWPFTemplate;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.util.BytePictureUtils;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class RenderDocxTemplate {
public static void main(String[] args) throws IOException {
// 模板文件路径
String templatePath = "D:\\templates\\template.docx";
// 输出文件路径
String outputPath = "D:\\output\\output.docx";
// 加载模板
XWPFTemplate template = XWPFTemplate.compile(templatePath).render();
// 数据准备
Map<String, Object> params = new HashMap<>();
params.put("name", new TextRenderData("宋体", 16, "李丽丽")); // 使用TextRenderData可以指定字体,确保中文显示
// 渲染模板
template.render(params);
// 写入输出文件,这里通过ByteArrayOutputStream和FileOutputStream结合,避免直接操作FileOutputStream可能引起的编码问题
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream fos = new FileOutputStream(outputPath)) {
template.write(baos);
fos.write(baos.toByteArray());
}
// 关闭模板
template.close();
}
}
这段代码使用了com.deepoove.poi
包下的类,这是Apache POI的一个扩展库Deepoove POI-Tl,它提供了更便捷的方式来处理模板和数据渲染。请注意,你需要在项目中引入相应的依赖来使用Deepoove POI-TL。
要在Maven项目中引入Deepoove POI-TL依赖,你可以在项目的pom.xml
文件中添加如下依赖配置:
<dependencies>
<!-- Deepoove POI-TL -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<!-- 请检查并使用最新版本号 -->
<version>1.18</version>
</dependency>
<!-- Apache POI 是 Deepoove POI-TL 的基础依赖,通常情况下会自动引入,但也可以显式声明 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<!-- 使用对应版本,确保与poi-tl兼容 -->
<version>5.2.2</version>
</dependency>
</dependencies>
如果是使用Gradle作为构建工具,可以在build.gradle
文件中添加如下依赖:
dependencies {
implementation 'com.deepoove:poi-tl:1.18' // 替换为最新版本
implementation 'org.apache.poi:poi-ooxml:5.2.2' // 确保与poi-tl版本兼容
}