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   
原文地址:https://www.cnblogs.com/jsbk/p/9518744.html