java后台导出word文档正文、表格、图片

文章目录

  • 前言
  • 一、XDocReport是什么?
  • 二、使用步骤
    • 1.制作word文档模板
    • 2.word文档关键字动态替换
    • 3.引入XDocReport、apache、freemarker相关依赖
    • 4.java后台代码示例:
  • 总结


前言

本文主要介绍XDocReport使用的模板引擎freemarker通过java后台导出word文档操作。例如导出这种word文档:

java后台导出word文档正文、表格、图片_第1张图片

一、XDocReport是什么?

XDocReport是进行对文档进行操作的一种java API(一种java对外接口),具体可以自行在github上找XDocReport的源码。在其README.md里有详细的XDocReport介绍和使用。

二、使用步骤

1.制作word文档模板

java后台导出word文档正文、表格、图片_第2张图片

 2.word文档关键字动态替换

一般导出的word文档都有固定的模板,但是里面的关键字可以动态替换的。例如:上图文档主要分两部分,第一部分是数字和文字,第二部分是表格。模板中的部分文字和数字、表格中的内容使我们要通过java后台代码动态替换的。

替换模板的内容需要2步操作:

1.打开word文档模板,选中要替换的内容,例如模板的“统计时间”,快捷键 Ctrl + F9 插入空域,插入空域后的例子:

java后台导出word文档正文、表格、图片_第3张图片

2.编辑域,右键选中编辑域,编辑域时类别选择“邮件合并”,域名选择 "MergeField",然后编辑域名属性,属性域名${startTime}要和后台定义的字段对应。

java后台导出word文档正文、表格、图片_第4张图片

java后台导出word文档正文、表格、图片_第5张图片

 3.编辑模板表格内容:表格的内容用java后台来理解可以解析为对象的集合,所以后台要定义一个实体类,实体类属性需包含表格列域名。模板中commodity是后台Commodity类对象,spmc为Commodity类的一个属性。编辑完总效果

java后台导出word文档正文、表格、图片_第6张图片

 4.将word模板复制到项目的resource的目录下:

java后台导出word文档正文、表格、图片_第7张图片

3.引入XDocReport、apache、freemarker相关依赖



  org.apache.poi
  poi
  4.1.1


  org.apache.poi
  poi-ooxml
  4.1.1


  org.jxls
  jxls
  2.6.0
  
    
      ch.qos.logback
      logback-core
    
  


  org.jxls
  jxls-poi
  1.2.0


  fr.opensagres.xdocreport
  fr.opensagres.xdocreport.core
  2.0.2


  fr.opensagres.xdocreport
  fr.opensagres.xdocreport.document
  2.0.2


  fr.opensagres.xdocreport
  fr.opensagres.xdocreport.template
  2.0.2


  fr.opensagres.xdocreport
  fr.opensagres.xdocreport.document.docx
  2.0.2


  fr.opensagres.xdocreport
  fr.opensagres.xdocreport.template.freemarker
  2.0.2


org.freemarker
freemarker
2.3.23


  commons-io
  commons-io
  2.5

4.java后台代码示例:

1.创建实体类

import lombok.Data;


@Data
public class Commodity {

	/**
	 * 商品名称
	 */
	private String spmc;
	/**
	 * 销售量
	 */
	private String xsl;

	/**
	 * 销售盈利
	 */
	private String xsyl;

}
 

2.创建下载文件controller类

package com.tellhow.ddzh.controller;

import com.tellhow.ddzh.vo.Commodity;
import com.tellhow.ddzh.vo.Goods;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * word下载
 *
 */
@Controller
@RequestMapping(value = "/wordDownload")
public class WordDownloadTest {
    @RequestMapping(value = "/load")
    public void generateWord(HttpServletResponse response) throws IOException, XDocReportException {
        //获取Word模板,模板存放路径在项目的resources目录下,转换成流操作
        InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");
        //注册xdocreport实例并加载FreeMarker模板引擎
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj,TemplateEngineKind.Freemarker);
        //创建xdocreport上下文对象
        IContext context = report.createContext();

        //创建要替换的文本变量,变量名需对应
        context.put("startTime", "2021-10-10");
        context.put("lastTime", "2022-01-01");
        List commodityList = new ArrayList<>();
        Commodity commodity1 = new Commodity();
        commodity1.setSpmc("手机");
        commodity1.setXsl("800");
        commodity1.setXsyl("600");
        Commodity commodity2 = new Commodity();
        commodity2.setSpmc("羽绒服");
        commodity2.setXsl("206");
        commodity2.setXsyl("66");

        commodityList.add(commodity1);
        commodityList.add(commodity2);
        
        //与模板表格的commodity对应
        context.put("commodity", commodityList);

        //创建字段元数据
        FieldsMetadata fm = report.createFieldsMetadata();
        //Word模板中的表格数据对应的集合类型
        fm.load("goods", Goods.class, true);

//        //输出到本地目录
//        FileOutputStream out = new FileOutputStream(new File("D://商品分析统计.docx"));
//        report.process(context, out);

        //浏览器端下载
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/msword");
        String fileName = "商品分析统计.docx";
        response.setHeader("Content-Disposition", "attachment;filename="
                .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
        report.process(context, response.getOutputStream());
    }


}

总结
例如:以上就是今天要讲的内容,后续加上导出图片和EXCEL的内容。

也可参考:Freemarker word导出教程 Freemarker word导出教程_@元气满满的博客-CSDN博客_freemarker导出word文档

你可能感兴趣的:(java,java,后端)