用 Freemarker 生成 word 文檔
1. 用word寫一個需要導出的word模板,然后存為xml格式。
2. 將xml中需要動態修改內容的地方,換成freemarker的標識符,例如:
<w:p wsp:rsidR="00D02906" wsp:rsidRDefault="00FA4C58" wsp:rsidP="00FA4C58">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
</w:pPr>
<w:r>
<w:t>${year}</w:t>
</w:r>
<w:r>
<w:rPr>
<wx:font wx:val="宋體"/>
</w:rPr>
<w:t>年度工作報告</w:t>
</w:r></w:p>
3. </span></span>用代碼生成:import freemarker.template.Configuration; import freemarker.template.Template;import java.io.*; import java.util.HashMap; import java.util.Map;
/**
- @Class name: CreateDoc
- <p/>
- Short description on the purpose of the program.
- @author : youfeng
@modified : 8/29/11 */ public class CreateDoc {
private Configuration configuration = null;
public CreateDoc() {
configuration = new Configuration(); configuration.setDefaultEncoding("utf-8");
}
public void create() throws Exception {
Map<String, Object> map = new HashMap<String, Object>(); map.put("date", "2011"); map.put("modifyDate", "2011/8/29"); map.put("modifyUser", "Zhu You Feng"); configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/"); Template t = configuration.getTemplate("doc1.ftl"); File outFile = new File("D:/outFile.doc"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))); t.process(map, out);
}
public static void main(String[] args) throws Exception {
new CreateDoc().create();
} }</pre></span>
添加圖片
如果你需要在word中添加圖片,那你就在第一步制作模板時,加入一張圖片占位,然后打開xml文檔,可以看到如下的一片base64編碼后的代碼:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData></div> </div> </span>只要將base64的代碼替換成例如:${image},如下:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">${image}</w:binData></div> </div> </span>這里要注意“>${image}<”這尖括號中間不能加任何其他的諸如空格,tab,換行等符號。
然后用代碼生成:
import freemarker.template.Configuration; import freemarker.template.Template; import sun.misc.BASE64Encoder;
import java.io.*; import java.util.HashMap; import java.util.Map;
/**
- @Class name: CreateDoc
- @author: youfeng
@modified: 8/29/11 */ public class CreateDocWithImage {
private Configuration configuration = null;
public CreateDocWithImage() {
configuration = new Configuration(); configuration.setDefaultEncoding("utf-8");
}
public void create() throws Exception {
Map<String, Object> map = new HashMap<String, Object>(); map.put("year", "2011"); map.put("person", "Zhu You Feng"); map.put("image", getImageStr()); configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/"); Template t = configuration.getTemplate("doc2.ftl"); File outFile = new File("D:/outFile.doc"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))); t.process(map, out);
}
private String getImageStr() {
String imgFile = "d:/test.jpg"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);
}
public static void main(String[] args) throws Exception {
new CreateDocWithImage().create();
} }</pre>
自定義載入模板
import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import sun.misc.BASE64Encoder;
import java.io.*; import java.util.HashMap; import java.util.Map;
public class DocumentGenerator { private Configuration configuration = null;
public static void main(String[] args) throws Exception {
Map<String, Object> map = new HashMap<String, Object>(); map.put("date", "2012"); map.put("modifyDate", "2011/8/29"); map.put("modifyUser", "Zhu You Feng"); new DocumentGenerator().createDoc("", "D:/outFile2.doc", map);
}
public DocumentGenerator() {
configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassicCompatible(true); configuration.setTemplateLoader(new ByteArrayStreamTemplateLoader(new ByteArrayInputStream( getBytesFromFile(new File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl")) )));
}
/**
- @param fileName
- @param outFileName
@param dataMap */ public void createDoc(String fileName, String outFileName, Map dataMap) { Template t = null; try {
t = configuration.getTemplate(fileName);
} catch (IOException e) {
e.printStackTrace();
} File outFile = new File(outFileName); Writer out = null; try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
public byte[] getBytesFromFile(File f) { if (f == null) {
return null;
} try {
FileInputStream stream = new FileInputStream(f); ByteArrayOutputStream out = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = stream.read(b)) != -1) out.write(b, 0, n); stream.close(); out.close(); return out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} return null; } }
class ByteArrayStreamTemplateLoader implements TemplateLoader {
InputStream in = null; public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) { in = inputStream; } public Object findTemplateSource(String name) throws IOException { System.out.println("findTemplateSource"); return in; } public long getLastModified(Object templateSource) { return 0; } public Reader getReader(Object templateSource, String encoding) throws IOException { System.out.println("getReader"); return new InputStreamReader(in); } public void closeTemplateSource(Object templateSource) throws IOException { System.out.println("closeTemplateSource"); if (in != null) { in.close(); } }
}</pre>來自:http://www.cnblogs.com/zhuyoufeng/archive/2011/09/01/2161558.html
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊