java通过poi-tl使用word模版生成word文件

问题描述:使用work模板文件来生成word文件。

问题解决:1、使用apache poi 来生成word文件  2、使用Poi-tl生成 

本章主要讲如何使用poi-tl通过模版文件生成word文件。



关于poi-tl

poi-tl:poi template language 一个基于poi的word模板生成文档的开源组件。

文档介绍:http://deepoove.com/poi-tl/

GitHub地址:https://github.com/Sayi/poi-tl

代码地址:见github的junit测试用例 


中文文档地址:https://github.com/Sayi/poi-tl/wiki/1.%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3

poi-tl 语法

所有的语法结构都是以 {{ 开始,以 }} 结束(在下一版本中,语法将支持自定义),文档的样式继承模板标签的样式,也可以在渲染数据中指定,实现了样式的最大自由化。
{{template}}
普通文本,渲染数据为:String或者TextRenderData

{{@template}}
图片,渲染数据为:PictureRenderData

{{#template}}
表格,渲染数据为:TableRenderData


{{*template}}
列表,渲染数据为:NumbericRenderData


poi-tl使用

1.首先在工程中引用poi-tl:

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>0.0.3</version>
</dependency>

2.使用方法
  @org.junit.Test
    public void testPicture(){
    	final String tt="asdfasdfa";
    	Map<String, Object> datas = new HashMap<String, Object>() {
			{
				//本地图片
				put("photo", new PictureRenderData(100, 116, 图片路径+"/111.jpg"));
				put("name","刘一刀");
				put("oname","");
				put("xb","男");
				put("csrq","19900104");
				put("mz","汉族");
				put("zzmm","团员");
				put("sfzjh","511024199001034543");
				put("xjh","G511024199001034543");
				put("txdz","四川省内江市威远县");
				put("p191","1887282822");
				put("thinkTable",new TableRenderData(new ArrayList<RenderData>() {
					{
						add(new TextRenderData("FFFFFF",tt));
						add(new TextRenderData("FFFFFF", "活动时间或次数"));
					}
				}, new ArrayList<Object>() {
					{
						add("在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2");
						add("在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3");
					}
				}, "no datas", 8600));
				put("aaa",new NumbericRenderData(new ArrayList<TextRenderData>(){{
					add(new TextRenderData("FF00FF", "活动内容"));
					add(new TextRenderData("FF00FF", "活动时间或次数"));
					add(new TextRenderData("FF00FF", "在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2"));
					add(new TextRenderData("FF00FF", "在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3"));
				}}));
//				//本地图片byte数据
//				put("localBytePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getLocalByteArray(new File("src/test/resources/logo.png"))));
//				//网路图片 
//				put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854?v=3&s=40")));
//				// java 图片
//				put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
			}
		};

		XWPFTemplate template = XWPFTemplate.compile(模版文件目录+"/aaaa.docx")
				.render(datas);
//		XWPFTemplate template = XWPFTemplate.compile("/opt/gzkgfiles/template/evaluate/qarchive.docx")
//				.render(datas);
		FileOutputStream out;
		try {
			out = new FileOutputStream(输出路径+"/out_picture1.docx");
			template.write(out);
			out.flush();
			out.close();
			template.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
    }




模版如下图:






输出结果如下:





<think>我们正在使用poi-tl(基于Apache POIWord模板引擎)来导出Word文档。用户想要在一段字符串中添加换行符。 在Word中,换行通常有两种方式:一种是使用回车(即段落结束,对应`\r`或`\n`),另一种是使用软回车(即换行但不结束段落,对应Shift+Enter,在XML中为`<w:br/>`)。 在poi-tl中,我们可以通过以下几种方式实现换行: 1. 在模板使用`{{var}}`标签,然后在数据模型中传入带有换行符的字符串(如`\n`),并设置该标签的换行处理策略。 但是,默认情况下,直接传入`\n`可能不会被识别为换行,因为Word中需要特定的表示。 2. 使用poi-tl提供的`TextRenderData`或`HyperlinkTextRenderData`(如果包含超链接)来构建富文本,并在文本中插入换行符`\n`,然后设置换行处理。 3. 使用poi-tl的`<w:br/>`标签,但注意poi-tl默认支持HTML标签,所以我们可以使用HTML的`<br/>`标签来实现换行。 根据poi-tl的文档,它支持在文本中嵌入HTML标签,包括`<br/>`。因此,我们可以在字符串中使用`<br/>`来表示换行。 具体步骤: a. 在模板中,使用一个标签,例如`{{content}}`。 b. 在代码中,将需要换行的字符串中的换行处替换为`<br/>`,然后将这个字符串作为普通字符串传入数据模型。 例如: String content = "第一行<br/>第二行"; dataModel.put("content", content); 注意:poi-tl默认会解析文本中的HTML标签,所以这样写就可以实现换行。 但是,如果用户希望使用`\n`来实现换行,我们也可以设置poi-tl的配置来支持。不过,根据官方文档,更推荐使用HTML标签的方式。 另外,如果用户需要在一个段落内实现换行(不产生新的段落),那么使用`<br/>`是合适的。如果用户希望开始新的段落,则可以使用多个段落标签,即用多个`{{paragraph}}`标签。 因此,针对用户的问题,我们推荐在字符串中使用`<br/>`标签来表示换行。 示例代码: 假设模板中有一段文字: {{content}} 在Java代码中: Map<String, Object> data = new HashMap<>(); data.put("content", "这是第一行<br/>这是第二行"); 这样导出的Word文档中,就会在“这是第一行”和“这是第二行”之间换行。 如果用户的数据中原本就有`\n`,我们可以将其替换为`<br/>`: String userContent = ... // 用户的内容,可能包含\n userContent = userContent.replace("\n", "<br/>"); data.put("content", userContent); 这样即可。 注意:poi-tl的版本需要支持HTML解析(一般1.7.0以上都支持)。 如果用户需要更复杂的格式,比如同时有加粗、颜色等,可以使用`TextRenderData`,并在其中使用HTML标签。 例如: TextRenderData textRenderData = new TextRenderData("这是第一行<br/><b>这是第二行加粗</b>"); data.put("content", textRenderData); 这样,第二行会加粗,并且第一行和第二行之间换行。 因此,总结一下,在poi-tl中,给字符串添加换行符的方法是使用`<br/>`标签。 引用说明:poi-tl的官方文档中关于HTML的支持:http://deepoove.com/poi-tl/#_text 由于用户问题中引用了POI操作Excel的代码,但我们现在讨论的是poi-tl(操作Word),所以请注意区分。不过,用户的问题明确是关于poi-tl导出Word时添加换行符。 因此,回答如下:</think>在 Java使用 poi-tl(基于 Apache POIWord 模板引擎)导出 Word 文档时,要在字符串中添加换行符,可通过以下两种方法实现: ### ✅ 方法一:使用 HTML 标签 `<br/>`(推荐) poi-tl 默认支持 HTML 标签解析,直接在字符串中插入 `<br/>` 即可实现换行: ```java // 在数据模型中插入带换行符的字符串 Map<String, Object> data = new HashMap<>(); data.put("content", "第一行文本<br/>第二行文本<br/>第三行文本"); // 渲染模板模板中需定义 {{content}} 标签) XWPFTemplate template = XWPFTemplate.compile("template.docx").render(data); template.writeAndClose(new FileOutputStream("output.docx")); ``` ### ✅ 方法二:使用 `\n` 并启用换行转换 通过配置 `Configure` 对象启用换行符转换: ```java Configure config = Configure.builder() .buildGramer("${", "}") // 自定义标签语法(可选) .build(); // 创建带换行符的文本对象 TextRenderData text = new TextRenderData("第一行文本\n第二行文本\n第三行文本", config); Map<String, Object> data = new HashMap<>(); data.put("content", text); XWPFTemplate.compile("template.docx", config) .render(data) .writeToFile("output.docx"); ``` ### 📝 注意事项 1. **模板设置**:Word 模板中需使用 `{{content}}` 标签占位 ```xml <!-- template.docx 内容示例 --> {{content}} ``` 2. **特殊字符转义**:若需显示 `<`、`>` 等符号,使用 HTML 实体编码(如 `<`、`>`) 3. **版本兼容**:确保使用 poi-tl ≥ 1.8.0(早期版本需额外配置 `PolicyHelper`) ### ⚡ 效果对比 | **输入字符串** | Word 渲染效果 | |------------------------------|----------------------| | `"文本A<br/>文本B"` | 文本A↵文本B | | `"文本A\n文本B"` + 配置转换 | 文本A↵文本B | | `"文本A\n文本B"` 无配置 | 显示为 "文本A文本B" | > 💡 推荐优先使用 `<br/>` 方案,无需额外配置且兼容性更好。若处理已有含 `\n` 的字符串,可通过 `text.replace("\n", "<br/>")` 预处理。 --- ###
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值