freemarker生产docx
时间: 2024-12-31 09:43:53 浏览: 6
### 使用FreeMarker生成Docx文档
为了实现这一目标,可以结合Apache POI库来处理样式和复杂布局。具体来说,在创建Word文档时,先利用FreeMarker模板引擎构建文档的内容框架,再通过Apache POI设置具体的格式化细节。
#### 准备工作
确保项目中引入了必要的依赖项,包括FreeMarker以及Apache POI的相关jar包。
#### 编写模板文件
创建一个`.ftl`结尾的模板文件用于描述文档结构。例如:
```html
<#-- doc.ftl -->
${title}
=================
<#list items as item>
* ${item.name}: ${item.value}
</#list>
```
此模板定义了一个简单的列表展示方式[^2]。
#### Java代码示例
下面是一段Java程序片段展示了如何加载上述模板并最终保存为.docx格式文件:
```java
import org.apache.poi.xwpf.usermodel.*;
import freemarker.template.Configuration;
import freemarker.template.Template;
// ...其他导入语句...
public class DocGenerator {
public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setClassForTemplateLoading(DocGenerator.class, "/templates");
Map<String, Object> dataModel = getData();
Template template = cfg.getTemplate("doc.ftl");
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, dataModel);
try (XWPFDocument document = new XWPFDocument()) {
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(content); // 插入由freemarker渲染后的文本
// 添加图片示例
InputStream picInputStream = new FileInputStream(new File("/path/to/image.png"));
document.addPictureData(picInputStream , Document.PICTURE_TYPE_PNG);
FileOutputStream out = new FileOutputStream("output.docx");
document.write(out);
out.close();
}
}
private static Map<String,Object> getData(){
List<Item> itemList=new ArrayList<>();
Item item1=new Item("Item One","Value one");
Item item2=new Item("Item Two","Value two");
itemList.add(item1);
itemList.add(item2);
HashMap<String,Object> rootMap=Maps.newHashMap();
rootMap.put("items",itemList );
return rootMap;
}
}
class Item{
private final String name,value;
public Item(final String n,final String v){
this.name=n;this.value=v;
}
public String getName(){return name;}
public String getValue(){return value;}
}
```
这段代码首先配置好了FreeMarker环境,并读取预设的数据模型;接着获取指定路径下的模板实例,经过加工处理后得到完整的HTML字符串形式的内容;最后借助于POI提供的API完成对新创建空白word文档的操作——向其中添加段落、文字乃至图像等内容,并按照设定好的位置关系排列好各个组件的位置,从而形成一份完整的电子文档。
阅读全文