java使用freemarker动态生成word

1、首先建立test.docx,内容如下。(生成的word文档如下形式):姓名,电话,图片

2、将word另存为xml

3、用编辑器编辑test.xml,找到图片所在的位置

替换后为:

4、保存,将test.xml改成test.ftl

5、java建立实体,对应三个字段

pom.xml

<dependency>
             <groupId>org.freemarker</groupId>
             <artifactId>freemarker</artifactId>
</dependency>
public class Data {
    
    private String name;
    
    private String tel;
    
    private String imgbase64;

}

6、建立DocumentHandler ,来处理数据

import java.io.BufferedWriter; 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter;
import java.io.Writer;  
import java.util.HashMap; 
import java.util.Map;

import org.apache.tomcat.util.codec.binary.Base64;

import freemarker.template.Configuration; 
import freemarker.template.Template; 
import freemarker.template.TemplateException; 
/**
 * 文件输出到指定目录处理
 */
public class DocumentHandler { 
    private Configuration configuration = null; 
    public DocumentHandler() { 
        configuration = new Configuration(); 
        configuration.setDefaultEncoding("utf-8"); 
    } 
    public void createDoc() throws Exception { 
        Data data=new Data(); 
        getData(data); 

       这里根据自己的实际情况来,本例是“/”
        configuration.setClassForTemplateLoading(this.getClass(),"/"); 
        Template t=null; 
        try { 
            //test.ftl为要装载的模板 
            t = configuration.getTemplate("test.ftl"); 
            File outFile = new File("E:\\test_new.doc"); 
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
            t.process(data, out);
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        
    } 
     private void getData(Data data) throws Exception{ 
          data.setName("lw");
          data.setTel("111111111");

          将图片E:\\test.png,打印到word
          File file = new File("E:\\test.png");
          FileInputStream fis = new FileInputStream(file);
          byte[] imgData = new byte[fis.available()];
          fis.read(imgData);
          fis.close();
          String imgbase64 = new Base64().encodeAsString(imgData); 
          data.setImgbase64(imgbase64);
          
      } 
     
     public static void main(String[] args) throws Exception {
         DocumentHandler dh=new DocumentHandler();
         dh.createDoc();
    }
} 

7、文件输出到浏览器

public void createDocResponse(DocumentDTO data, String ftlName,String fileName,HttpServletResponse response) throws Exception {
        configuration.setClassForTemplateLoading(this.getClass(),"/");
        Writer out =null;
        try {
            Template t = configuration.getTemplate("ftl/"+ftlName+".ftl");
            //输出文档路径及名称
            ServletOutputStream outputStream = response.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "utf-8");
            out = new BufferedWriter(outputStreamWriter);// 取得输出流
            response.reset();// 清空输出流
            response.setContentType("application/vnd.ms-word;charset=UTF-8");// 定义输出类型
            t.process(data, out);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(out != null){
                out.close();
            }
        }
    }

8、执行一下,即可生成word。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值