访问我的博客

前言

最近遇到项目需求需要将数据库中的部分数据导出到 word 中,具体是在一个新闻列表中将选中的新闻导出到一个 word 中。参考了网上一些教程,实现了该功能,在此记录下来。

导出结果如下:

图中为导出的其中两条新闻。

搜索网上导出 word 的方式有很多种,但是很多都是一笔带过,有示例代码的只找到了 POI 导出,和通过 FreeMarker 方式导出,但是只是具有参考意义。本文采取使用 FreeMark 方式。

实现步骤

  1. Maven 工程引入FreeMarker 的依赖,非 Maven 工程添加 jar 包
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.26-incubating</version>
</dependency>
  1. 创建 word 模板

    1. 新建 word 替换内容为占位符

    2. 另存模板为 XML 文件

    3. 使用 NotePad++ 打开 xml 文件

    4. 选中全部内容,到这里进行格式化

    5. 将原内容替换为格式化后的内容

    6. 因为我的 word 的内容是一个列表,所以需要添加一个 freemarer 标签标识

    7. 找到 <w:document> 元素下面的 <w:body> 元素,添加 <#list newsList news> , 并在</w:body>结束标签之前闭合 </#list>, 此处的 newsList 为后台读取模板时需要需要渲染数据map集合的key, 其所对应的是一个list集合。

    8. 保存为 FreeMarker 的模板文件,后缀为 ftl 格式,拷贝到项目中

  2. 编写代码

    1. 从数据中查询数据集合放入Map中, 调用工具方法,返回流
    Map<String, Object> root = new HashMap<String, Object>();
    root.put("newsList", newsList);//newsList为新闻对象集合
    String template = "/temp.ftl"; //模板文件的地址
    ByteArrayOutputStream outputStream = WordUtil.process(root, template);
    return outputStream;
    1. 调用下载工具类进行下载即可。
    DownloadUtil.download(byteArrayOutputStream, response, returnname);

    注:在实现功能的时候,由于采取的是 ajax 请求方式,导致只是将流写入 Response 时, Response 为 xml 格式的数据。但是想要实现的效果是弹出下载框,下载 word 文档。最后查询资料,修改ajax请求为form表单提交方式(ajax form),才弹出下载框实现了功能。

文章涉及工具类

//WordUtil.java
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map; import freemarker.template.Configuration;
import freemarker.template.Template; public final class WordUtil {
private static Configuration configuration = null; private WordUtil() {
throw new AssertionError();
} /**
* 根据模板生成相应的文件
* @param root 保存数据的map
* @param template 模板文件的地址
* @param path 生成的word文档输出地址
* @return
*/
public static synchronized ByteArrayOutputStream process(Map<?, ?> root, String template) { if (null == root ) {
throw new RuntimeException("数据不能为空");
} if (null == template) {
throw new RuntimeException("模板文件不能为空");
} ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String templatePath = template.substring(0, template.lastIndexOf("/"));
String templateName = template.substring(template.lastIndexOf("/") + 1, template.length()); if (null == configuration) {
configuration = new Configuration(Configuration.VERSION_2_3_23); // 这里Configurantion对象不能有两个,否则多线程访问会报错
configuration.setDefaultEncoding("utf-8");
configuration.setClassicCompatible(true);
}
configuration.setClassForTemplateLoading(WordUtil.class, templatePath); Template t = null;
try {
t = configuration.getTemplate(templateName);
Writer w = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
t.process(root, w); // 这里w是一个输出地址,可以输出到任何位置,如控制台,网页等
w.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
return outputStream;
} }
//DownloadUtil.java
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; public class DownloadUtil { /**
* @param byteArrayOutputStream 将文件内容写入ByteArrayOutputStream
* @param response HttpServletResponse 写入response
* @param returnName 返回的文件名
*/
public static void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment; filename=" + returnName);
response.setContentLength(byteArrayOutputStream.size());
OutputStream outputstream = response.getOutputStream(); //取得输出流
byteArrayOutputStream.writeTo(outputstream); //写到输出流
byteArrayOutputStream.close(); //关闭
outputstream.flush(); //刷数据
}
}

源码下载

点我下载

参考链接

Java之word导出下载的更多相关文章

  1. java spring boot 导出/下载文本文件操作(包含写文本文件)

    内容简介 本文主要内容为使用java把内容写入文本文件,并实现下载/导出的功能. 实现步骤 1. controller层 @ResponseBody @RequestMapping(value = & ...

  2. java 导出word 并下载

    记录一下导出操作 源码: /************ * 导出word 并下载 * @param id 房号记录编号 * ***********************/ @RequestMappin ...

  3. java用freemarker导出数据到word(含多图片)

    一.制作word模版 新建word文档,按照需要设置好字体等各种格式:这里为了显得整齐使用了无边框的表格. 将word文档另存为xml文件(注意不是word xml文档,我吃了这家伙的大亏了) 然后用 ...

  4. java用iText导出word文档

    1.需要导入的jar包 2.导出word并下载其实是分两步的. 第一步是将需要导出的数据导出(上传)到服务器上 第二步是将服务器上的文档下载到本地 3. 第一步.上传文档 (1)设置响应信息以及构造上 ...

  5. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  6. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  7. Java中导入导出Excel -- POI技术

    一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...

  8. java导入、导出

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  9. Java操作excel_导出与读取(导入)

    我自己的jar包下载 一.介绍 常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导 ...

随机推荐

  1. maven插件调试方法

    前言 以IntelliJ IDEA为例,通常我们调试maven项目时,都是直接点击调试按钮即可.但maven编写的插件就不同了,由于插件需要打包成Jar加载到项目中,所以如果我们需要在编写插件源码时调 ...

  2. 腾讯云下的CentOS7 安装最新版Python3.7.0

    第一步下载Python3.7.0 刚开始我是在windows上下载之后 传到FTP服务器上的 后来发现使用以下命令可以更快捷地下载到服务器 *  wget https://www.python.org ...

  3. Laravel篇之Laravel的安装及使用

      想搭建一个基于Lavarel和vuejs的个人网站,使用git推送到github存储,千里之行,始于足下,首先要做的用composer来下载laravel框架,并成功运行. 一.使用compose ...

  4. ConstraintLayout使用

    引言 ConstraintLayout是一个ViewGroup,允许您以灵活的方式定位和调整小部件的方法,项目中的布局嵌套问题对项目性能有着不小的威胁,布局能实现扁平化的话会让软件性能得到很大的提升, ...

  5. 3.类和接口_EJ

    第13条: 使类和成员的可访问性最小化 良好的模块设计能隐藏其内部数据和其他实现细节,模块之间只通过它们的API进行通信.java语言提供了许多机制来协助隐藏信息.访问控制机制决定了类.接口和成员的可 ...

  6. 网页导航栏 html + css的代码实现

    一般来讲,我们的网页导航栏是这么个模式来构建在结构上:1.首先我们需要给导航栏的div 给个类名 一般为nav2.然后就是一个无序表格 3.由于导航栏的文字一般都是链接用来跳转页面 要在li里面包含一 ...

  7. 洛谷P4588 [TJOI2018]数学计算(线段树)

    题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; cons ...

  8. 如何理解MVC?

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范. 那么MVC框架究竟干了些什么:用一种业务逻辑. ...

  9. Windows 批处理获取某路径下最新创建的文件的名称

    批处理获取某路径下最新创建的文件的名称 by:授客 QQ:1033553122 echo off setlocal enabledelayedexpansion rem 设置文件所在目录 set sr ...

  10. socket通讯,TCP,UDP,HTTP的区别

    socket编程有TCP和UDP, TCP:传送控制协议(Transmission Control Protocol) 传输控制协议TCP是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机 ...