java 导出数据到word (2)有图片

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

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

复制代码
 1       < w:p  wsp:rsidR ="00D02906"  wsp:rsidRDefault ="00FA4C58"  wsp:rsidP ="00FA4C58" >
 2           < w:pPr >
 3               < w:jc  w:val ="center" />
 4               < w:rPr >
 5                   < w:rFonts  w:hint ="fareast" />
 6               </ w:rPr >
 7           </ w:pPr >
 8           < w:r >
 9               < w:t > ${year} </ w:t >
10           </ w:r >
11           < w:r >
12               < w:rPr >
13                   < wx:font  wx:val ="宋体" />
14               </ w:rPr >
15               < w:t > 年度工作报告 </ w:t >
16           </ w:r >
复制代码

17     </w:p> 

3.        用代码生成:
复制代码
 1  import  freemarker.template.Configuration;
 2  import  freemarker.template.Template;
 3 
 4  import  java.io. * ;
 5  import  java.util.HashMap;
 6  import  java.util.Map;
 7 
 8  /**
 9   * @Class name:    CreateDoc
10   * <p/>
11   * Short description on the purpose of the program.
12   *  @author  : youfeng
13   * @modified : 8/29/11
14    */
15  public   class  CreateDoc {
16 
17       private  Configuration configuration  =   null ;
18 
19       public  CreateDoc() {
20          configuration  =   new  Configuration();
21          configuration.setDefaultEncoding( " utf-8 " );
22      }
23 
24       public   void  create()  throws  Exception {
25          Map < String, Object >  map  =   new  HashMap < String, Object > ();
26          map.put( " date " " 2011 " );
27          map.put( " modifyDate " " 2011/8/29 " );
28          map.put( " modifyUser " " Zhu You Feng " );
29 
30          configuration.setClassForTemplateLoading( this .getClass(),  " /docTemplate/ " );
31          Template t  =  configuration.getTemplate( " doc1.ftl " );
32          File outFile  =   new  File( " D:/outFile.doc " );
33          Writer out  =   new  BufferedWriter( new  OutputStreamWriter( new  FileOutputStream(outFile)));
34          t.process(map, out);
35      }
36 
37       public   static   void  main(String[] args)  throws  Exception {
38           new  CreateDoc().create();
39 
40      }
41  }
复制代码

 

添加图片

如果你需要在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  import  freemarker.template.Configuration;
 2  import  freemarker.template.Template;
 3  import  sun.misc.BASE64Encoder;
 4 
 5  import  java.io. * ;
 6  import  java.util.HashMap;
 7  import  java.util.Map;
 8 
 9  /**
10   * @Class name:    CreateDoc
11   *  @author : youfeng
12   * @modified: 8/29/11
13    */
14  public   class  CreateDocWithImage {
15 
16       private  Configuration configuration  =   null ;
17 
18       public  CreateDocWithImage() {
19          configuration  =   new  Configuration();
20          configuration.setDefaultEncoding( " utf-8 " );
21      }
22 
23       public   void  create()  throws  Exception {
24          Map < String, Object >  map  =   new  HashMap < String, Object > ();
25          map.put( " year " " 2011 " );
26          map.put( " person " " Zhu You Feng " );
27          map.put( " image " , getImageStr());
28 
29          configuration.setClassForTemplateLoading( this .getClass(),  " /docTemplate/ " );
30          Template t  =  configuration.getTemplate( " doc2.ftl " );
31          File outFile  =   new  File( " D:/outFile.doc " );
32          Writer out  =   new  BufferedWriter( new  OutputStreamWriter( new  FileOutputStream(outFile)));
33          t.process(map, out);
34      }
35 
36       private  String getImageStr() {
37          String imgFile  =   " d:/test.jpg " ;
38          InputStream in  =   null ;
39           byte [] data  =   null ;
40           try  {
41              in  =   new  FileInputStream(imgFile);
42              data  =   new   byte [in.available()];
43              in.read(data);
44              in.close();
45          }  catch  (IOException e) {
46              e.printStackTrace();
47          }
48          BASE64Encoder encoder  =   new  BASE64Encoder();
49           return  encoder.encode(data);
50      }
51 
52       public   static   void  main(String[] args)  throws  Exception {
53           new  CreateDocWithImage().create();
54 
55      }
56  }
复制代码

 

自定义载入模板

 

   1 import freemarker.cache.TemplateLoader;

复制代码
  2  import  freemarker.template.Configuration;
  3  import  freemarker.template.Template;
  4  import  freemarker.template.TemplateException;
  5  import  sun.misc.BASE64Encoder;
  6 
  7  import  java.io. * ;
  8  import  java.util.HashMap;
  9  import  java.util.Map;
 10 
 11  public   class  DocumentGenerator {
 12       private  Configuration configuration  =   null ;
 13 
 14       public   static   void  main(String[] args)  throws  Exception {
 15          Map < String, Object >  map  =   new  HashMap < String, Object > ();
 16          map.put( " date " " 2012 " );
 17          map.put( " modifyDate " " 2011/8/29 " );
 18          map.put( " modifyUser " " Zhu You Feng " );
 19           new  DocumentGenerator().createDoc( "" " D:/outFile2.doc " , map);
 20      }
 21 
 22       public  DocumentGenerator() {
 23          configuration  =   new  Configuration();
 24          configuration.setDefaultEncoding( " utf-8 " );
 25          configuration.setClassicCompatible( true );
 26          configuration.setTemplateLoader( new  ByteArrayStreamTemplateLoader( new  ByteArrayInputStream(
 27                          getBytesFromFile( new  File( " D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl " ))
 28                  )));
 29      }
 30 
 31       /**
 32       *  @param  fileName
 33       *  @param  outFileName
 34       *  @param  dataMap
 35        */
 36       public   void  createDoc(String fileName, String outFileName, Map dataMap) {
 37          Template t  =   null ;
 38           try  {
 39              t  =  configuration.getTemplate(fileName);
 40          }  catch  (IOException e) {
 41              e.printStackTrace();
 42          }
 43          File outFile  =   new  File(outFileName);
 44          Writer out  =   null ;
 45           try  {
 46              out  =   new  BufferedWriter( new  OutputStreamWriter( new  FileOutputStream(outFile)));
 47          }  catch  (FileNotFoundException e1) {
 48              e1.printStackTrace();
 49          }
 50           try  {
 51              t.process(dataMap, out);
 52          }  catch  (TemplateException e) {
 53              e.printStackTrace();
 54          }  catch  (IOException e) {
 55              e.printStackTrace();
 56          }
 57      }
 58 
 59       public   byte [] getBytesFromFile(File f) {
 60           if  (f  ==   null ) {
 61               return   null ;
 62          }
 63           try  {
 64              FileInputStream stream  =   new  FileInputStream(f);
 65              ByteArrayOutputStream out  =   new  ByteArrayOutputStream( 1000 );
 66               byte [] b  =   new   byte [ 1000 ];
 67               int  n;
 68               while  ((n  =  stream.read(b))  !=   - 1 )
 69                  out.write(b,  0 , n);
 70              stream.close();
 71              out.close();
 72               return  out.toByteArray();
 73          }  catch  (IOException e) {
 74              e.printStackTrace();
 75          }
 76           return   null ;
 77      }
 78  }
 79 
 80 
 81  class  ByteArrayStreamTemplateLoader  implements  TemplateLoader {
 82 
 83      InputStream in  =   null ;
 84 
 85       public  ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
 86          in  =  inputStream;
 87      }
 88 
 89       public  Object findTemplateSource(String name)  throws  IOException {
 90          System.out.println( " findTemplateSource " );
 91           return  in;
 92      }
 93 
 94       public   long  getLastModified(Object templateSource) {
 95           return   0 ;
 96      }
 97 
 98       public  Reader getReader(Object templateSource, String encoding)  throws  IOException {
 99          System.out.println( " getReader " );
100           return   new  InputStreamReader(in);
101      }
102 
103       public   void  closeTemplateSource(Object templateSource)  throws  IOException {
104          System.out.println( " closeTemplateSource " );
105           if  (in  !=   null ) {
106              in.close();
107          }
108      }
109  }
复制代码
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值