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

word生成freemarker模板 并下载

程序员文章站 2022-04-30 09:25:52
...

java后台生成word技术选型

所用技术 优点 缺点
Jacob 功能强大 代码量大,设置样式繁琐;需要windows平台支持,无法跨平台
Apache POI 读写excel功能强大、操作简单 一般只用它读取word,能够创建简单的word,不能设置样式,功能太少
Java2word 功能强大,操作简单 能满足一般要求,不支持07格式,国人开发的,参考资料较多,需要windows平台支持
iText 功能全,能满足一般要求 不能直接生成或操作doc文档,只能生成rtf格式的文档,rtf也可以用word打开
JSP 操作简单,代码量少 能把当前页面导出简单的word,不能设置样式,美观性差,无法操作word
XML(最佳) 代码量少,样式、内容容易控制,打印不变形,完全符合office标准 需要提前设计好word模板,把需要替换的地方用特殊标记标出来

综上此文以XML为例

java后台生成word是编写好word后,添加占位符,对编辑好的文件另存为xml格式文件。把xml格式文件放入项目中,利用freemarker生成word文件,并下载.

freemarker引入项目

此次用的版本是freemarker-2.3.23.jar
可自行下载,或者maven导入

word生成xml模板

word2010编辑好文档,插入xml语法支持的变量,另存为xml格式文件保存。(word从2003开始支持xml格式,所以从03版word都可以保存为xml格式文档)

编写word
word生成freemarker模板 并下载
插入变量
word生成freemarker模板 并下载
word编辑完成,保存为xml格式文档,以我自己使用的word2010为例。

注:如果另存为的xml文件格式乱码,则需要在word中设置为utf-8编码保存。设置保存编码位置:文件-选项-高级-滚动滚轮找到 Web选项并点击进入-选择编码,按如下图进行设置点击确定。此时xml文档编码为utf-8,项目编码也设置为utf-8即可。

word编码设置截图
word生成freemarker模板 并下载

另保存为xml文件时的截图
word生成freemarker模板 并下载

改写生成的xml模板

word生成为xml文档后,会出现原本在一起的变量被分开了,如图,此时需将图中蓝色部分删掉。届时模板文件已经做好了。
word生成freemarker模板 并下载

后台代码

此后台代码为网页端下载word,如需下载到硬盘可另行改写代码

package com.demo.controller;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

@Controller
@RequestMapping("/word")
public class wordExcept {
	private static Configuration configuration;

	static {
		configuration = new Configuration();
		/** 设置编码 **/
		configuration.setDefaultEncoding("utf-8");
	}
	private ResponseEntity<byte[]> creatWord(HttpServletRequest request, String fileName, Map root) throws IOException {
		// TODO Auto-generated method stub

		// TODO Auto-generated method stub
		String fileDirectory = request.getSession().getServletContext().getRealPath("") + "/doc/";
		// String fileDirectory1 ="D:/qqq/qwe/";
		FileOutputStream fos = null;
		/** 加载文件 **/
		Writer out = null;
		try {
			configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
			/** 加载模板 **/
			Template template = configuration.getTemplate(fileName + ".xml");

			/** 指定输出word文件的路径 **/
			File docFile = new File(fileDirectory + fileName + ".doc");
			fos = new FileOutputStream(docFile);
			out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"), 1024);
			try {

				template.process(root, out);
			} catch (TemplateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
					fos.close();

				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		String docFile = fileDirectory + fileName + ".doc";
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		headers.setContentDispositionFormData("attachment", fileName + ".doc");
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(docFile)), headers,
				HttpStatus.CREATED);
	}

}

调用测试,creatWord方法
第一个request是HttpServletRequest,
第二个数据是模板名称(不含文件后缀名),
第三个是map数据。

	@RequestMapping(value = "/download")
	public ResponseEntity<byte[]> craeteWord(HttpServletRequest request, HttpServletResponse response) throws IOException  {
		Map root=new HashMap();//data数据
	        List reportresult =new ArrayList();
	        Map rep=new HashMap();
	        rep.put("test1", "统计设备一");
	        rep.put("test2", "192.168.6.64");
	        rep.put("test3", "30");
	        rep.put("test4", "20");
	        rep.put("test5", "10");
	        rep.put("test5", "6");
	        reportresult.add(rep);
	        root.put("reportresult", reportresult);
	
	return WordExcept.creatWord(request,"apply",root);	
	}

前台代码

由于是在网页端下载,所以window.location.href直接调用即可
word生成freemarker模板 并下载
自此利用freemarker,把word生成的xml文件设置值后下载就完成了。