使用Freemarker生成Word

場景:
須要經過模板動態生成word,模板中包括普通字符串和表格
實現方法:
須要:Freemarker  下載

一、將word模板另存爲xml格式,將須要替換的地方使用標籤和指令替換,具體參照Freemarker開發手冊java

(1)普通字符串替換爲${stringdemo}app

(2)表格替換編輯器

<#list rows as row>
......
<#list row as item>
....${item}..
</#list>
......
</#list>
測試

二、將修改後的xml模板文件後綴名改成.ftl編碼

三、實例程序spa

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

public class DemoFreemarker {

	public static void main(String[] args) {
		creatWord();
	}
	
	@SuppressWarnings("unchecked")
	public static void creatWord() {
		try {
			//建立配置實例
			Configuration cfg = new Configuration();
			cfg.setDefaultEncoding("utf-8");
			cfg.setDirectoryForTemplateLoading(new File("C://wtt"));
			cfg.setObjectWrapper(new DefaultObjectWrapper());

			//獲取模板
			Template temp = cfg.getTemplate("demo.ftl");
			temp.setEncoding("utf-8");
			
			//建立數據模型
			Map root = new HashMap();
			root.put("stringdemo", "字符串測試");
			List rows = new ArrayList();
			for (int j=1; j<5; j++) {
				List row = new ArrayList();
				for (int i=1; i<16; i++) {
					row.add(j+""+i);
				}
				rows.add(row);
			}
			root.put("rows", rows);
			
			//將模板和數據模型合併生成文件
			File docFile = new File("C://wtt/demo.doc");
			Writer docout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
			temp.process(root, docout);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注:

一、支持word版本爲2003及更高版本.net

二、此種方法優勢是跨平臺,而且不依賴MS office wordcode

三、若是生成的文件不能打開,用文本編輯器打開生成的wordorm

(1)若是開始爲 ?<?xml version="1.0" ,即開頭多出個問號,由於ftl模板文件格式有問題,須要將格式設置爲「UTF-8無BOM」格式,可以使用Notepad++文本編輯器設置xml

(2)若是生成的word格式爲ANSI,則將ftl模板第一行聲明編碼改成gbk,如:<?xml version="1.0" encoding="gbk" standalone="yes"?>

相關文章
相關標籤/搜索