poi-tl怎么插入list
时间: 2025-06-30 14:12:44 浏览: 14
在使用 `poi-tl`(POI Template Language)库时,插入 `List` 类型的数据结构是常见的需求,尤其适用于生成包含动态数据的 Word 文档。`poi-tl` 提供了对集合类型数据的模板渲染能力,支持通过占位符和循环语法将列表内容插入文档。
### 插入 List 数据的基本方式
假设有一个 `List<String>` 或者更复杂的对象列表,可以通过模板标签 `{{@list}}...{{/list}}` 来实现遍历渲染。以下是一个具体的示例:
#### 示例:插入字符串列表
```java
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
import com.deepoove.poi.XWPFTemplate;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PoiListExample {
public static void main(String[] args) throws IOException {
// 模板路径(假设模板中包含 {{@list}}...{{/list}} 结构)
String templatePath = "template.docx";
XWPFTemplate template = XWPFTemplate.compile(templatePath).render(new HashMap<>());
// 准备数据
List<String> items = new ArrayList<>();
items.add("苹果");
items.add("香蕉");
items.add("橙子");
// 构建数据模型
Map<String, Object> data = new HashMap<>();
data.put("list", items);
// 渲染模板并输出
template.render(data);
try (FileOutputStream out = new FileOutputStream("output.docx")) {
template.write(out);
}
}
}
```
对应的模板内容如下(Word 中的文本段落):
```
水果列表:
{{@list}}
- {{item}}
{{/list}}
```
渲染结果会是:
```
水果列表:
- 苹果
- 香蕉
- 橙子
```
#### 示例:插入对象列表
如果要插入的对象列表较为复杂,例如 `List<User>`,可以在模板中访问对象属性:
```java
public class User {
private String name;
private int age;
// 构造方法、getter 和 setter 略
}
```
准备数据:
```java
List<User> users = new ArrayList<>();
users.add(new User("张三", 25));
users.add(new User("李四", 30));
Map<String, Object> data = new HashMap<>();
data.put("users", users);
```
模板内容:
```
用户信息:
{{@users}}
姓名:{{name}}, 年龄:{{age}}
{{/users}}
```
渲染结果:
```
用户信息:
姓名:张三, 年龄:25
姓名:李四, 年龄:30
```
### 自定义渲染策略
对于更复杂的场景,可以使用 `RenderPolicy` 实现自定义的列表插入逻辑。例如,控制样式、表格行插入等:
```java
import com.deepoove.poi.policy.RenderPolicy;
import com.deepoove.poi.template.ElementTemplate;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
public class CustomListPolicy implements RenderPolicy {
@Override
public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
XWPFParagraph paragraph = eleTemplate.getParagraph();
List<String> items = (List<String>) data;
for (String item : items) {
XWPFParagraph newPara = paragraph.getDocument().createParagraph();
newPara.createRun().setText("- " + item);
}
// 删除原始占位符段落
CTBody body = paragraph.getDocument().getDocument().getBody();
body.remove(paragraph.getCTP());
}
}
```
注册策略并在模板中使用:
```java
Map<String, Object> data = new HashMap<>();
data.put("custom_list", new CustomListPolicy());
```
模板内容:
```
{{custom_list}}
```
### 注意事项
- 在模板中,`{{@list}}` 表示开始遍历,`{{item}}` 是当前元素的值,`{{/list}}` 表示结束。
- 使用 `poi-tl` 时,确保引入正确的依赖版本,避免兼容性问题。
- 对于大量数据插入,可结合分页或分批处理策略以提升性能[^1]。
---
阅读全文
相关推荐


















