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

文章目录


前言

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

一、XDocReport是什么?

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

二、使用步骤

1.制作word文档模板

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

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

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

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

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

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

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

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

<!--word导出相关依赖-->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.1.1</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.1</version>
</dependency>
<dependency>
  <groupId>org.jxls</groupId>
  <artifactId>jxls</artifactId>
  <version>2.6.0</version>
  <exclusions>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.jxls</groupId>
  <artifactId>jxls-poi</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.xdocreport.core</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.xdocreport.document</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.xdocreport.template</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.5</version>
</dependency>

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<Commodity> 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文档

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值