欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA 下载Word文档

程序员文章站 2022-04-30 12:48:34
...

最近在做java中页面下载word文档,给大家分享一下。

我的环境是MyEclipse10 , JDK1.6 ,Tomcat 6,我这里使用的是FreeMarker。FreeMarker是一个引擎模板。点击了解

FreeMarker。好了,废话不多说直接上代码


一。首先我们需要制作一个ftl模板,这样freemarker才能识别模板

        我们新建一个word文档,非常简单的word生成

JAVA 下载Word文档

然后我们将这个word文档另存为xml格式,然后我们用notepad++ 或者其他编辑器打开它

JAVA 下载Word文档JAVA 下载Word文档

JAVA 下载Word文档

这里使用notepad++ 打开。格式是不存在的我们需要调一下他的格式


们需要通过Plugin Manager进行安装插件。更郁闷的是7.5版本之后notepad++就不带Plugin Manager这一功能了。

当然我么可以通过https://blog.csdn.net/yuan_ren_sheng/article/details/80555430 这里进行下载安装,这里不再阐述

JAVA 下载Word文档

下载好以后我们点击Show Plugin Manager 找到xml Tools进行安装。安装好

JAVA 下载Word文档

通过这里Pretty开头的,我们把xml文件全选。然后随便点Pretty开头的方法。有的人notepad++上面没有XML Tools

JAVA 下载Word文档

格式调好了,然后把他转换成ftl结尾

JAVA 下载Word文档

写一个工具类

package utils;

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 DownUtil {
	 	private static Configuration configuration = null;
	    private static HashMap<String, Template> allTemplates = null;
	  
	    static {  
	        configuration = new Configuration();  
	        configuration.setDefaultEncoding("utf-8");  
	        configuration.setClassForTemplateLoading(DownUtil.class,"/ftl/");  
	        /*  
	         * allTemplates = new HashMap<>(); // Java 7 钻石语法  
	         */  
	        allTemplates = new HashMap<String, Template>();  
	        try {  
	            allTemplates.put("resume", configuration.getTemplate("word3.ftl"));  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
	    }  
	  
	    private DownUtil() {  
	        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;  
	    }  
}

web.xml

    
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>servlet.download</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>

这里直接访问HelloWorld让他触发浏览器下载引擎。

Servlet层

package servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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 utils.DownUtil;


public class download extends HttpServlet {
	
	@Override
	protected 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 = DownUtil.createDoc(map, "resume");  
            fin = new FileInputStream(file);  
  
            resp.setCharacterEncoding("utf-8");  
            resp.setContentType("application/msword");  
            // 设置浏览器以下载的方式处理该文件默认名为resume.doc  
            resp.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(); // 删除临时文件  
        }  
	}
	
}

JAVA 下载Word文档

JAVA 下载Word文档

相关标签: word