需求:web页面点击按钮,触发浏览器下载功能,预览或者保存word本地文件。

可预见的问题:java库选择的是freemarker、word基本的模板的制作。

我电脑的环境是tomcat6+jdk1.6+MyEclipse 10

第一步:制作简单的ftl模板文件

新建一个doc文件,如下图所示  在需要进行动态变化和遍历的地方添加变量,如下图所示。

另存为xml格式的文件。

使用notepad++或者其他工具打开xml文件,查看生成的模板是否正确。

$符号和变量名没有被分开算正常。${topic}这几个符号是紧密相连的算正常。如果被分开的话,重新编辑一下,确保如我说的那样,其他变量类同。

最后将文件保存之后重命名,后缀由xml改为ftl。使得freemarker能识别相应的模板。

第二步:将ftl文件放入项目中。编写下载word的java代码。

项目的文件存放位置。

项目是比较简单的web项目,使用的是Struts2。下面是web.xml中的配置,一切从简。

只有一个简单的跳转,当链接访问/saveDocServlet的时候请求会进入MyServlet中,进行逻辑处理。

下面是MyServlet的代码;

package com.zhutong.servlet;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zhutong.util.WordGenerator;public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("utf-8");Map<String, Object> map = new HashMap<String, Object>();
/*      Enumeration<String> paramNames = req.getParameterNames();// 通过循环将表单参数放入键值对映射中while (paramNames.hasMoreElements()) {String key = paramNames.nextElement();String value = req.getParameter(key);map.put(key, value);}*/map.put("topic", "我是标题");map.put("module", "我是模块");// 提示:在调用工具类生成Word文档之前应当检查所有字段是否完整// 否则Freemarker的模板殷勤在处理时可能会因为找不到值而报错 这里暂时忽略这个步骤了File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类WordGenerator的createDoc方法生成Word文档file = WordGenerator.createDoc(map, "resume");fin = new FileInputStream(file);resp.setCharacterEncoding("utf-8");resp.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件默认名为resume.docresp.addHeader("Content-Disposition","attachment;filename=resume.doc");out = resp.getOutputStream();byte[] buffer = new byte[512]; // 缓冲区int bytesToRead = -1;// 通过循环将读入的Word文件的内容输出到浏览器中while ((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}} finally {if (fin != null)fin.close();if (out != null)out.close();if (file != null)file.delete(); // 删除临时文件}}
}

map中key值对应ftl模板${topic}中的属性,可以直接取到key值对应的value值。value值可以是写死的,可以是前后台交互的变量,上面代码中注释的是其中一部分,稍加扩展就可以实现。

上面代码中引用到一个生成word文件的工具类WordGenerator.createDoc(map,"resume")

下面是工具类的对应的代码:

package com.zhutong.util;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;import freemarker.template.Configuration;
import freemarker.template.Template;@SuppressWarnings("deprecation")
public class WordGenerator {private static Configuration configuration = null;private static HashMap<String, Template> allTemplates = null;static {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");configuration.setClassForTemplateLoading(WordGenerator.class,"/com/zhutong/ftl");/** allTemplates = new HashMap<>(); // Java 7 钻石语法*/allTemplates = new HashMap<String, Template>();try {allTemplates.put("resume", configuration.getTemplate("resume.ftl"));} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e);}}private WordGenerator() {throw new AssertionError();}public static File createDoc(Map<?, ?> dataMap, String type) {String name = "temp" + (int) (Math.random() * 100000) + ".doc";File f = new File(name);Template t = allTemplates.get(type);try {// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}return f;}}

写到这里,后台的代码已经写完了。方便起见,在浏览器中输入*****:**/****/saveDocServlet

对应生成的结果为:

Java之下载word文档相关推荐

  1. Java之下载word文档,linux视频监控

    第二步:将ftl文件放入项目中.编写下载word的java代码. 项目的文件存放位置. 项目是比较简单的web项目,使用的是Struts2.下面是web.xml中的配置,一切从简. 只有一个简单的跳转 ...

  2. Java之下载word文档,java企业级应用架构

    使用notepad++或者其他工具打开xml文件,查看生成的模板是否正确. 符号和变量名没有被分开算正常.符号和变量名没有被分开算正常.符号和变量名没有被分开算正常.{topic}这几个符号是紧密相连 ...

  3. 关于java下载Word文档图片显示不全的问题

    关于java 从FTP下载Word文档图片显示不全的问题 最近想实现这样一个功能,从ftp服务器获取word文档下载下来,但是出现了一下问题: 本地启动的tomcat,可以下载word,图片显示正常: ...

  4. java下载word文档到本地

    普通的下载功能,不过依然有一个值得关注的重要点--请看到最后! ***HTML***按钮就不上了,你开心设计成button和a我都没有意见: ***JS***代码: function downLoad ...

  5. Java预览下载word文档(poi-tl、thymeleaf模板)

    主要功能 预览word文档 生成并下载word文档 实现 前端Vue代码 预览功能主要使用的是docx-preview下载方式如下: npm install docx-preview --save & ...

  6. 如何用java代码给Word文档添加水印?

    为防止非法使用.定义所有权.显示文档状态等多种目的,在 Word 文档中添加水印.在本文中,您将学习如何使用 Java 为 Word 文档添加水印.文章将分别演示如何将文字和图片水印插入到Word文档 ...

  7. world添加水印java,Java添加水印到Word文档

    水印是一种常用于各种文档的声明.防伪手段,一般可设置文字水印或者加载图片作为水印.以下内容将分享通过Java编程给Word文档添加水印效果的方法,即 文本水印 图片水印 使用工具:Free Spire ...

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

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

  9. Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像

    图像通常用于表示 Word 文档中的重要信息.在文本旁边包含图像使内容更具吸引力.在某些情况下,您可能需要以编程方式提取嵌入在 Word 文档中的图像.为此,本文介绍了如何使用 Java 从 Word ...

最新文章

  1. iOS提示气泡,带动画
  2. 分别用ToolBar和自定义导航栏实现沉浸式状态栏
  3. 好消息:VS 2008 and .NET 3.5 Beta 2 发布了
  4. GCC选项_-Wl,-soname 及 DT_NEEDED 的解释
  5. 向右滑动返回Activity
  6. es6 TypedArray视图
  7. radware alteon 负载均衡器设置
  8. 指向类对象的指针非空但是部分对象成员不存在原因分析
  9. MVCC(Multiversion concurrency control)
  10. 在linux中安装字体
  11. error: passing as ‘this‘ argument discards qualifiers [-fpermissive]
  12. 半监督学习与直推式学习
  13. 产品经理快(ku)乐(bi)的一天~
  14. 神器win7系统登录服务器失败原因,Win7系统提示加载dll失败“五种解决方法(图文)...
  15. 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链...
  16. 服务器系统怎么用主板做RAID,超微主板怎么创建RAID磁盘阵列 服务器组建RAID0、RAID1图文教程...
  17. 蓝桥杯: 调手表【BFS】【Python】
  18. 2017JAVA秋招总结
  19. 理解 ARC 实现原理 -- 详细总结
  20. 成都商铺商场价格增速仍放缓,租金开始达到止跌回升状态了

热门文章

  1. 麦克风音频服务器未响应,耳机和麦克风都没坏,插上电脑后为什么不能语音聊天?...
  2. 计算机和数学 论文参考文献,计算机数学方向论文参考文献 计算机数学参考文献怎么写...
  3. spark的kafka的低阶API createDirectStream的一些总结。
  4. Maven私服上使用自己的私服下载不了第三方jar包的问题解决
  5. VSO Downloader下载工具vso_downloader_setup.exe
  6. Adobe国际认证考试难吗?
  7. 人群计数:技术难点、商业产品化成功案例、现状、传统做法、硬件设备、
  8. 限流削峰——限流器的实现
  9. Bean 销毁的方式与顺序
  10. Android 如何判断一个应用在运行