用 Freemarker 生成 word 文档

    xiaoxiao2023-08-31  195

    

    阅读目录

    添加图片自定义载入模板

    1.       word写一个需要导出的word模板,然后存为xml格式。

    2.       xml中需要动态修改内容的地方,换成freemarker的标识符,例如:

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 < 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 >< span style = "line-height:22px;font-family:'Courier New';" class = "Apple-style-span" >< span style = "color:#0000ff;" ></</ span >< span style = "color:#800000;" >w:p</ span >< span style = "color:#0000ff;" >></ span ></ span > 3.       用代码生成: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 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();          }   }

    添加图片

    如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:

    1  < w:binData  w:name ="wordml://03000001.png"  xml:space ="preserve" > iVBORw0…(很省略很省略)…CC </ w:binData >

    只要将base64的代码替换成例如:${image},如下:

    1  < w:binData  w:name ="wordml://03000001.png"  xml:space ="preserve" > ${image} </ w:binData >

    这里要注意>${image}<这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

    然后用代码生成:

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 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();          }   }

    回到顶部

    自定义载入模板

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 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();          }      } } 相关资源:freemaker 生成word文档
    最新回复(0)