这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/12790904.html

本次使用的是easypoi框架

官方教程:https://opensource.afterturn.cn/doc/easypoi.html

gitee地址:https://gitee.com/tianj/easypoi

引入maven依赖

<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.3.0</version>
</dependency>
<!--注意:word中要使用循环等标签必须单独导入以下依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>

word模板内容

参数说明:$fe:jobs(jobs:java代码中集合名称),t.属性名(t表示集合中单个对象)

EasyPoi 模板 表达式支持

  • 空格分割
  • 三目运算 {{test ? obj:obj2}}
  • n: 表示 这个cell是数值类型 {{n:}}
  • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  • fn: 格式化数字 {{fn:(obj;###.00)}}
  • fe: 遍历数据,创建row
  • !fe: 遍历数据不创建row
  • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
  • !if: 删除当前列 {{!if:(test)}}
  • 单引号表示常量值 '' 比如'1' 那么输出的就是 1
  • &NULL& 控制
  • ]] 换行符

工具类

WordUtil.java

package com.example.demo.utils;

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Map; public class WordUtil { /**
* 导出word(2007版本docx)
*
* @param templateWordPath
* @param dataMap
* @return
* @throws Exception
*/
public static byte[] exportWord(String templateWordPath, Map<String, Object> dataMap) throws Exception {
File tf = new File(templateWordPath);
if (!tf.exists() || !tf.isFile()) {
throw new RuntimeException("File [" + templateWordPath + "] Not Found Or Not File.");
}
XWPFDocument document = WordExportUtil.exportWord07(templateWordPath, dataMap);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
document.write(bos);
return bos.toByteArray();
} }

控制器方法

package com.example.demo.controller;

import cn.afterturn.easypoi.word.entity.WordImageEntity;
import com.example.demo.utils.WordUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; @Controller
public class TestController { @RequestMapping(value = "/export")
public void export(HttpServletResponse response){
try {
//
Map<String, Object> dataMap = new HashMap<>();

//导出单个数据
             dataMap.put("title","我是导出文档的标题");

//导出对象
Map<String, String> user = new HashMap<>();
user.put("name", "姓名");
user.put("age", "443");
user.put("address", "地址");
user.put("other", "我不知道");
dataMap.put("user", user); //导出图片
WordImageEntity image = new WordImageEntity();
//设置图片尺寸
image.setHeight(500);
image.setWidth(500);
//图片地址,需要是本地项目中图片,如果是第三方的需要把图片先下载下来
image.setUrl("C:\\Users\\Fr\\Pictures\\11163144hqk4.JPG");
image.setType(WordImageEntity.URL);
dataMap.put("images", image); List<Map<String, Object>> jobs = new ArrayList<>(); //导出列表
Map<String, Object> job;
for (int i = 0; i < 5; i++) {
job = new HashMap<>();
job.put("id", "ID-" + i);
job.put("name", "姓名:" + i);
jobs.add(job);
} dataMap.put("jobs", jobs); // “D:/word-template-test.docx”是word模板所在位置
byte[] doc = WordUtil.exportWord("D:/word-template-test.docx", dataMap); response.setContentType("application/vnd.ms-word;charset=utf-8");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + new String("word文档导出".getBytes("gb2312"), "ISO8859-1")+".docx"); //文件名中文需进行格式转换,不然可能出现乱码
OutputStream out = response.getOutputStream();
out.write(doc);
out.flush(); } catch (Exception e) {
e.printStackTrace();
}
} }

导出效果

JAVAWEB导出word文档,遍历表格数据,导出图片的更多相关文章

  1. 使用freemarker生成word文档处理表格数据

    1.把需要从数据库取值的字段用${}括起来,如:${busDate};2.表格数据的循环需要加标签:<#list tbl3 as tbl3>......</#list>< ...

  2. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  3. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  4. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  5. NPOI插件生成导出word文档

    因为之前没有接触NPOI过这个插件,所以几乎都是自己一边百度摸索一边学习. 这个插件对于Excel的数据导入和导出,可以说是很方便了, 但是对于导出word文档,可以说是很少的,百度了很多....也不 ...

  6. asp.net 将word文档进行编辑并导出一个新的word

    最近做项目,需要多word文档进行编辑并导出一个新的word,在最初的word编辑中留下特定的字符串用来替换,然后在本地生成一个新的word文档,并且不修改服务器中的word文档,这样才能保证服务器中 ...

  7. C# 导出word文档及批量导出word文档(1)

         这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量 ...

  8. C#导出Word文档开源组件DocX

    1.帮助文档,这东西找了很久,而且它版本很旧,还是英文,W8.1系统上打不开 http://download.csdn.net/detail/zuofangyouyuan/7673573 2.开源网址 ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  10. Java 用Freemarker完美导出word文档(带图片)

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

随机推荐

  1. Codeforces 1458E - Nim Shortcuts(博弈论+BIT)

    Codeforces 题目传送门 & 洛谷题目传送门 首先看到这样的题我们不妨从最特殊的情况入手,再逐渐推广到一般的情况.考虑如果没有特殊点的情况,我们将每个可能的局面看作一个点 \((a,b ...

  2. HDU 6755 - Fibonacci Sum(二项式定理+推式子)

    题面传送门 其实是一道还好的题罢,虽然做了我 2147483647(bushi,其实是 1.5h),估计也只是因为 HDU 不支持数据下载所以错误总 debug 出来 首先看到 \(10^9+9\) ...

  3. 【GS文献】全基因组选择模型研究进展及展望

    目录 1. GS概况 2. GS模型 1)直接法 GBLUP 直接法的模型改进 ①单随机效应 ②多随机效应 2)间接法 间接法模型 基于间接法的模型改进 3. GS模型比较 模型比较结论 4.问题及展 ...

  4. 43-Reverse Nodes in k-Group

    Reverse Nodes in k-Group My Submissions QuestionEditorial Solution Total Accepted: 58690 Total Submi ...

  5. 商业爬虫学习笔记day7-------解析方法之bs4

    一.Beautiful Soup 1.简介 Beautiful Soup 是python的一个库,最主要的功能是从网页抓取数据.其特点如下(这三个特点正是bs强大的原因,来自官方手册) a. Beau ...

  6. D3学习-加载本地数据

    在加载本地数据时,弄了很久都无法显示出来,后来才知道是要把数据文件和html文件都加载到服务器上面 这样就可以显示出来了,

  7. Shell学习(一)——Shell简介

    参考博客: [1]Shell简介

  8. Oracle中分割逗号函数REGEXP_SUBSTR

    最近优化FORM中的查询条件遇到某个字段可以选取多个值的问题,思路当然就是选取时将多个值通过某个符号拼接起来,查询数据的时候将拼接后的字符串按照符号分割开,在分割逗号的时候用到了一个新的方法REGEX ...

  9. sax方式解析XML学习笔记

    原理:对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素开始与结束.文档结束等地方 通知事件处理函数,由事件处理函数相应动作然后继续同样的扫描,直至文档结束. 优点:消耗资源比较少: ...

  10. 01_ubantu国内软件源配置

    查找自己版本对应的软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 以下为19.10版本清华大学的,个人100M的带宽,平均安装速度在600K ...