zoukankan      html  css  js  c++  java
  • freemarker导出word 文档list 集合遍历数据和图片

    因为业务需求,需要导出word 文档,效果如下:

    上述字段 每一行为list 遍历得到

    技术:   freemarker 技术---我们word 高级版本(ftl 的制作)

    1 首先要准备ftl 文档

    打开word 编辑,变为下面形式(注意,下面为表格插入,一行一列)

    然后将word 保存为xml  文档

    打开xml 文档,下面我们就更改四处,

    一加入 <w:tr>前<#list list as list>    第一个list 不能变  第二个list 为变量名  第三个list 为别名

    二将${fieldname}  改为${list.fieldname}

    三将${fieldname} 改为${list.fieldname}

    四</w:tr>后加入</#list>

    注意:下面为省略的代码   代码格式化 ---  notepad++ 打开-插件-XMLTools-pretty print开头的全点击
      <#list list as list>
                            <w:tr>
                                <w:tblPrEx>
                                    <w:tblBorders>
                                     .......
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia"/>
                                                <w:lang w:val="en-US"
                                                        w:eastAsia="zh-CN"/>
                                            </w:rPr>
                                            <w:t>${list.fieldname}</w:t>
                                        </w:r>
                                    </w:p>
                                   .......
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia"/>
                                                <w:lang w:val="en-US"
                                                        w:eastAsia="zh-CN"/>
                                            </w:rPr>
                                            <w:t>${list.field}</w:t>
                                        </w:r>
                                    </w:p>
                                    <w:p>
                                        
                                    </w:p>
                                </w:tc>
                            </w:tr>
                        </#list>

    将改好的xml 保存,如果notepad++报错不用理会,将xml 改为ftl 文件,就得到我们需要的ftl了,编译后的不要用word打开

    2 java 代码的实现

    引入jar 包

      <properties>
        <!--freemarker-->
        <freemarker.version>2.3.23</freemarker.version>
        
      </properties>
      <dependencies>
      
        <!--freemarker-->
        <dependency>
          <groupId>org.freemarker</groupId>
          <artifactId>freemarker</artifactId>
          <version>${freemarker.version}</version>
        </dependency>
      
     

    ftl 文档存放

    代码书写

    package export;
    import java.io.*;  
    import java.util.ArrayList;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
    import freemarker.template.Configuration;  
    import freemarker.template.Template;  
    import freemarker.template.TemplateException;  
    import sun.misc.BASE64Encoder;  
      
    public class DocumentHandler {  
      
        private Configuration configuration = null;  
      
        public DocumentHandler() {  
            configuration = new Configuration();  
            configuration.setDefaultEncoding("utf-8");  
        }  
      
        public void createDoc() {  
             // 要填入模本的数据文件  
            Map dataMap = new HashMap();  
            getData(dataMap);  
    //      getTest(dataMap);  
            // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,    
              // 这里我们的模板是放在com.template包下面    
            configuration.setClassForTemplateLoading(this.getClass(),  
            "/com/template");  
            Template t = null;  
            try {  
                 // test.ftl为要装载的模板   
                t = configuration.getTemplate("3.ftl");  
                t.setEncoding("utf-8");  
      
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            // 输出文档路径及名称  
            File outFile = new File("D:/test3.doc","utf-8");  //要与上下文编码一致
            Writer out = null;  
              
            try {  
                out = new BufferedWriter(new OutputStreamWriter(  
                new FileOutputStream(outFile), "utf-8"));  
            } catch (Exception e1) {  
                e1.printStackTrace();  
            }  
      
            try {  
                t.process(dataMap, out);  
                out.close();  
            } catch (TemplateException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
          
        /** 
         * 注意dataMap里存放的数据Key值要与模板中的参数相对应  
         * @param dataMap 
         *  
         */  
        @SuppressWarnings("unchecked")  
        private void getData(Map dataMap) {  
    
             dataMap.put("name", "表格设计的合理性美观性要考虑");    
               
             List<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();  
                
               for(int i=1;i<=5;i++){  
                 Map<String, Object> map=new HashMap<String, Object>();  
                 map.put("fieldname", "字段姓名"+i);  
                 map.put("field", "字段内容"+i);    
                 newsList.add(map);  
                }  
               
                dataMap.put("list",newsList); //注意list 的名字 
        }    

     生成文档

    package export;
    
    public class Export {
    
        
        public static void main(String[] args) {
            
            DocumentHandler dh=new DocumentHandler();  
            dh.createDoc();  
            System.out.println("end");  
            
        }
    }

     结束

    后记,导出图片

      dataMap.put("image", getImageStr());  
     1  private String getImageStr() {  
     2          String imgFile = "d:/1.png";  
     3          InputStream in = null;  
     4          byte[] data = null;  
     5          try {  
     6              in = new FileInputStream(imgFile);  
     7              data = new byte[in.available()];  
     8              in.read(data);  
     9              in.close();  
    10          } catch (IOException e) {  
    11              e.printStackTrace();  
    12          }  
    13          BASE64Encoder encoder = new BASE64Encoder();  
    14          return encoder.encode(data);  
    15      }  
    16   
  • 相关阅读:
    vue2 v-model/v-text 中使用过滤器的方法示例
    HTML5游戏开发案例教程合集
    Docker实战案例视频课程
    Java项目框架架构与优化教程
    Linux云计算-虚拟化技术视频教程
    udl
    Chloe官网及基于NFine的后台源码毫无保留开放
    抽象类存在的意义和作用
    Shell 脚本语法
    Github 高级搜索功能
  • 原文地址:https://www.cnblogs.com/jsbk/p/9518744.html
Copyright © 2011-2022 走看看