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

利用freemarker导出我们想要的数据格式(此时以word文档为例)

程序员文章站 2022-04-29 22:39:51
...

利用freemarker导出我们想要的数据格式(此时以word文档为例)

freemarker百度百科

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

准备工作

1.1基本介绍
freemarker是一个非常强大的转化的插件,我们可以用来做很多的事情,比如生成excel表格,word等,每次使用都有其独特的模块等,所以我们做事情的时候就要想好自己想要的做成的格式,这样我们就能够很快的达到我们的目的,本文主将的是生成word文档的相关的说明

1.2导入相应的jar包或者是坐标

<!--引入freemaker-->
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.22</version>
    </dependency>

1.3建立相关的模板arc.doc文件
利用freemarker导出我们想要的数据格式(此时以word文档为例)
1.4将文件转化为xml格式,然后导入到相关的项目中,在项目中再转化为ftl格式,因为平时的文档不会转化为这种格式,所以在idea的环境中我们可以转化为这种格式
利用freemarker导出我们想要的数据格式(此时以word文档为例)

实现流程

2.1.通过工具类来将map中的输入到模块中去

利用freemarker导出我们想要的数据格式(此时以word文档为例)
利用freemarker导出我们想要的数据格式(此时以word文档为例)
利用freemarker导出我们想要的数据格式(此时以word文档为例)
2.2.相关的工具类的源码

package cn.ujiuye.utils;

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

import java.io.*;
import java.util.Map;

/**
 * 传建文件对象的工具类
 */
public class MDoc {

	//读取加载ftl文件
	private Configuration configuration = null;

	public MDoc() {
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
	}

	/*
	 * 参数一dataMap:将要在doc上显示的数据保存在map里
	 * 参数二fileName:指定生成文件的绝对路径
	 */
	public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException {
		//获取模板文件所在的包路径
		configuration.setClassForTemplateLoading(this.getClass(), "/cn/ujiuye/template");
		Template t=null;
		try {
			//从模板文件所在的包路径中获取指定的模板
			t = configuration.getTemplate("myarc.ftl");
		} catch (IOException e) {
			e.printStackTrace();
		}
		File outFile = new File(fileName);
		Writer out = null;
		FileOutputStream fos=null;
		try {
			fos = new FileOutputStream(outFile);
			//字符流转化为字节流
			OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
			//为字符输出流添加缓存的功能
			out = new BufferedWriter(oWriter);
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
		try {
			//dataMap:将要在doc上显示的数据保存在map里;out:文件流
			t.process(dataMap, out);
			out.close();
			fos.close();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2.3.下载附件,以我们想要的格式来下载

 //下载附件,当点击的下载的时候以附件的形式开始下载 即下载当前登录用户的档案
    @RequestMapping("/downarc")
    public ResponseEntity<byte[]> downarc(HttpSession session) throws Exception{
        Employee emp = (Employee) session.getAttribute("emp");
        Employee emparc = us.getArc(emp.getEid());
        //往map集合中存入相关的数据
        Map map = new HashMap();
        map.put("ename",emparc.getEname());
        map.put("esex",emparc.getEsex());
        map.put("bir",new SimpleDateFormat("yyyy-MM-dd").format(emparc.getArc().getBirthday()));
        map.put("mz",emparc.getArc().getMinzu());
        MDoc mDoc = new MDoc();
        mDoc.createDoc(map,"D:\\oa\\files\\arc\\emparc.doc");

        File file = new File("D:\\oa\\files\\arc\\emparc.doc");
        HttpHeaders hh=new HttpHeaders();
        hh.setContentDispositionFormData("attachment",new String("emparc.doc".getBytes("gbk"),"iso-8859-1"));
        hh.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),hh, HttpStatus.OK);
    }

运行结果
利用freemarker导出我们想要的数据格式(此时以word文档为例)