RTFTempate integration 官方文档页
新建java的maven空项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>maventest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<repositories>
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--依赖spring1.2.6-->
<dependency>
<groupId>net.sourceforge.rtftemplate</groupId>
<artifactId>rtftemplate</artifactId>
<version>1.0.1-b13</version>
<exclusions>
<exclusion>
<groupId>springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
建一个controller
@GetMapping("/word")
public void word(HttpServletRequest request, HttpServletResponse response) throws Exception{
ClassPathResource classPathResource = new ClassPathResource("rtfTemp/rfsubcount.rtf");
RTFTemplateBuilder builder = null;
if (context == null)
builder = RTFTemplateBuilder.newRTFTemplateBuilder();
else
builder = RTFTemplateBuilder.newRTFTemplateBuilder(context);
RTFTemplate rtfTemplate = new RTFTemplate();
// Parser
rtfTemplate.setParser(new RTFDocumentHandler());
// Transformer
rtfTemplate.setTransformer(new RTFVelocityTransformerImpl());
// Template engine
VelocityTemplateEngineImpl templateEngine = new VelocityTemplateEngineImpl();
// Initialize velocity engine
templateEngine.setVelocityEngine(new VelocityEngine());
rtfTemplate.setTemplateEngine(templateEngine);
rtfTemplate.setTemplate(classPathResource.getFile());
IContext ctx = rtfTemplate.getTemplateEngine().newContext();
rtfTemplate.put("type", "type");
rtfTemplate.put("reportDate1", "1");
rtfTemplate.put("reportDate2", "2");
List<Map<String, Object>> dataList = new ArrayList<>();
Map<String, Object> data1 = new HashMap<>();
data1.put("companyname", "companyname1");
data1.put("subcount",200);
dataList.add(data1);
Map<String, Object> data2 = new HashMap<>();
data2.put("companyname", "companyname1");
data2.put("subcount",200);
dataList.add(data2);
rtfTemplate.put("companysubs", dataList);
response.setContentType("application/rtf");
response.setHeader("Content-Disposition", "attachment; filename=\"" + "123.doc" + "\"");
// 根据xml中的field的描述,使用rtfTemplate的context中的变量,开始同名替换rtf中的变量,生成word下载
rtfTemplate.merge(response.getWriter());
}
在resources目录准备模板rtf文件和xml字段说明文件,文件名要相同,注意xml加后缀fields
rtfTemp/rfsubcount.rtf
rtfTemp/rfsubcount.fields.xml
rtf文件制作,打开wps的word,安装下面图片写,表格表示list,另存为rtf文件
字段说明文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<fields>
<description><![CDATA[]]></description>
<mergefield>
<list>true</list>
<listInfo>$companysubs.companyname</listInfo>
<name>$companysubs.companyname</name>
<description><![CDATA[]]></description>
</mergefield>
<mergefield>
<list>true</list>
<listInfo>$companysubs.subcount</listInfo>
<name>$companysubs.subcount</name>
<description><![CDATA[]]></description>
</mergefield>
<mergefield>
<list>false</list>
<listInfo>$reportDate1</listInfo>
<name>$reportDate1</name>
<description><![CDATA[]]></description>
</mergefield>
<mergefield>
<list>false</list>
<listInfo>$reportDate2</listInfo>
<name>$reportDate2</name>
<description><![CDATA[]]></description>
</mergefield>
<mergefield>
<list>false</list>
<listInfo>$type</listInfo>
<name>$type</name>
<description><![CDATA[]]></description>
</mergefield>
</fields>
生成的word效果,图片