文章目录

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

前言

本文主要介绍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文档

java后台导出word文档正文、表格、图片相关推荐

  1. Java动态导出word文档内容及图片

    前言 最近公司在做一个工业柔性产线管控,项目中有一个需求要将工序中流程图及流程图中的子流程及工步相关信息导入到表格中(因为流程图下的子流程图有无及数量未知,所以最好的办法就是使用动态导入):因为以前更 ...

  2. 【Java实现导出Word文档功能 XDocReport +FreeMarker】

    Java实现导出Word文档功能(XDocReport +FreeMarker) 前言 在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表.医院的患者统计报表.电商平台的 ...

  3. java循环导出word文档_Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  4. 【Python】批量导出word文档中的图片、嵌入式文件

    Python 批量导出word文档中的图片.嵌入式文件 需求 学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交 ...

  5. vue 导出word文档(包括图片)

    vue 导出word文档(包括图片) 1.打开终端,安装依赖 -- 安装 docxtemplater npm install docxtemplater pizzip --save-- 安装 jszi ...

  6. java 图片 word文档_【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  7. java freemarker word_Java 用Freemarker完美导出word文档(带图片)(示例代码)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  8. Java——EasyPoi导出word文档,itextpdf转换pdf

    EasyPoi导出word文档,itextpdf转换pdf 文章目录 EasyPoi导出word文档,itextpdf转换pdf 前言 一.依赖 二.工具类 1.WordUtil 2.PDF工具类 3 ...

  9. Java 导出Word文档(含图片)doc格式 (保姆级)

    1.maven仓库 <!-- freemarker jar --><dependency><groupId>org.freemarker</groupId&g ...

  10. vue页面导出Word文档(含图片)

    引用插件 安装 npm i docxtemplater@3.17.6 npm i pizzip npm i jszip-utils@0.1.0 npm i jszip@2.6.1 npm i file ...

最新文章

  1. 归并排序详解(python实现)
  2. HTML特殊字符编码对照表
  3. unity vr 交互_基于手动的VR / MR交互,用于删除实体
  4. 4倍速!ML.NET Model Builder GPU 与 CPU 对比测试
  5. ASP.NET Core MVC I\/O编程模型
  6. 542. 01 Matrix
  7. 电影混混天团经典的台词
  8. Linux系统调用表(x86_64)
  9. 遇到问题的时候,要学会问问题
  10. 综合应用WPF/WCF/WF/LINQ之二十九:代码生成器之DBMLToCode
  11. 【学习Spring框架】依赖注入和控制反转异同?
  12. Tomcat日志总结
  13. 苹果 Apple Id 不同区域的不同点
  14. 前端移动端开发(基础)
  15. python外国网站爬虫_10分钟教你用python爬取网站信息:这可能是全网最好用的爬虫代码...
  16. 像模拟人生的 java游戏下载_我的世界1.7.2模拟人生整合包
  17. codeforces 834-A. The Useless Toy
  18. Draggabilly中文文档
  19. STM32F1xx_StdPeriph_Driver——SPI
  20. 对话《旅行青蛙》制作团队:游戏就是将现实中的不可能变为可能 | 覆盖客户全生命周期管理,神州云动六朵云来袭

热门文章

  1. 声卡驱动正常但就是没有声音,驱动人生解决方案
  2. 删除-驱动人生节能省电方案
  3. 基于Javaweb实现小区物业管理系统
  4. 光敏传感器c语言,光敏传感器的工作原理及其应用
  5. ZigBee与Android的智能家居控制系统设计
  6. python结巴分词代码_结巴分词Python代码
  7. 红米note 4x Android 8,红米note 4X升级安卓7.0:MIUI8提前公测
  8. robotframework-selenium2library-导入可选参数
  9. VM Player虚拟机的固定IP方法
  10. Android实现录屏直播(一)ScreenRecorder的简单分析