1 将模板需要替换的地方换成${nian} ${yue} ${ri} 第一个坑:写了${...}的地方java中必须有值与之对应,否则出错,或者加上!“”
2 将word存成xml,再改扩展名为.ftl
3 将图片的base64字符串改成${im}
4 多张的时候需要循环 第二坑:</#list> list是这样结束的
第三坑:图片名称和SRC需要用变量表示,否则第一张出现多次
XML中最重要的一段:
<#list images as im><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="${"wordml://0200000"+im_index+1+".jpg"}" xml:space="preserve">${im} </w:binData><v:shape id="图片 1" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:412.5pt;height:513.75pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="${"wordml://0200000"+im_index+1+".jpg"}" o:title=""/></v:shape></w:pict></#list>
java的方法:
package util; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; /** * 利用FTL模板生成doc文档 * @author Hzz * */ public class WordTest { private Configuration configuration = null; public WordTest() { configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); } public void createDoc(String dir, String fileName, String savePath, Map<String, Object> sDate) { Template t = null; try { // 取模板的路径 configuration.setDirectoryForTemplateLoading(new File(dir)); // 设置异常处理 configuration .setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); // 设置木板的路径文件 t = configuration.getTemplate(fileName); } catch (IOException e) { e.printStackTrace(); } // 输出文档路径及名称 File outFile = new File(savePath); Writer out = null; try { //设置编码格式 out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile), "utf-8")); } catch (Exception e1) { e1.printStackTrace(); } try { //套用模板,替换变量 t.process(sDate, out); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { WordTest wordTest=new WordTest(); Map<String,Object> map = new HashMap<String, Object>(); // map.put("nian", "2017"); // map.put("yue", "12"); // map.put("ri", "17"); String base64Str1 = Util.generateImageBase64Str("C:/Users/admin/Workspaces/MyEclipse Professional 2014/bootstrop/src/util/pic1.png"); String base64Str2 = Util.generateImageBase64Str("C:/Users/admin/Workspaces/MyEclipse Professional 2014/bootstrop/src/util/pic2.jpg"); List list = new ArrayList(); list.add(base64Str1); list.add(base64Str2); map.put("images", list.toArray()); wordTest.createDoc("C:/Users/admin/Workspaces/MyEclipse Professional 2014/bootstrop/src/util/", "Doc2.ftl", "H:/doc.doc", map); } }