将数据按规定模板输出为word文件

一、制作文档模板并放入项目

1.先在WPS上做好文件格式

2.将文件另存为xml格式

3.再重命名为ftl格式

 

4.将文件放入项目中

这个路径是在下面FreeMarkerUtil中所约定的

二、写接口

1.Controller

这里可以为方法添加自己需要的请求参数供筛选数据使用,此处暂略。

    @GetMapping("/download")
    public void download(HttpServletResponse response) throws Exception {
        plzStatisticsHetieService.download(response);
    }

 2.Service

void download(HttpServletResponse response)throws Exception;

3.ServiceImpl

@Override
public void download(HttpServletResponse response) throws Exception {

        Map<String,Object> map = new HashMap<>();//主体
        /*
        往map里塞数据,这里是用的假数据做演示
        * */
        map.put("averageDays","92");
        map.put("fastProportion","40.00");
        map.put("freeSoil","5000");
        map.put("freeHouse","1200");
        map.put("staffingNum","921");

        String dirPath =  File.separator + DateUtil.formatDate(new Date(),"yyyy_MM_dd")+File.separator;
        String filePath = "/usr/local/nfs/tmp/word" + dirPath;

        String fileName = "统计表-"+System.currentTimeMillis()+".doc";
        String templateName = "statistics.ftl";
        File file = FreeMarkerUtil.createWord(map,templateName,filePath,fileName);
        if (null == file){
            throw new Exception("下载失败");
        }
        response.addHeader("content-disposition","attachment;filename="
                +java.net.URLEncoder.encode(fileName,"UTF-8")
        );
        OutputStream out = response.getOutputStream();
        InputStream is = new FileInputStream(file);

        byte[] b = new byte[4096];
        int size = is.read(b);
        while(size>0){
            out.write(b,0,size);
            size = is.read(b);
        }
        out.close();
        is.close();
}
实现类中的FreeMarkerUtil
package com.***.***.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.lang.StringUtils;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.ui.freemarker.SpringTemplateLoader;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FreeMarkerUtil {


	/**
	 * @throws Exception
	 * @description 获取模板
	 */
	public static String getContent(String templatePath,Object data) throws Exception{


	    if(StringUtils.isEmpty(templatePath)){
	        throw new Exception("templatePath can not be empty!");
	    }

	    try{
	        Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置

	        config.setDefaultEncoding("UTF-8");

	        SpringTemplateLoader SpringTemplateLoader = new SpringTemplateLoader(new DefaultResourceLoader(),"/templates/");

	        config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
	        config.setLogTemplateExceptions(false);
	        config.setTemplateLoader(SpringTemplateLoader);


	        Template template = config.getTemplate(templatePath);//根据模板名称 获取对应模板
	        StringWriter writer = new StringWriter();

	        template.process(data, writer);//模板和数据的匹配
	        writer.flush();
	        String html = writer.toString();
	        return html;
	    }catch (Exception ex){
	        throw new Exception("FreeMarkerUtil process fail",ex);
	    }
	}


	/**
	 * @Desc:生成word文件
	 * @param dataMap word中需要展示的动态数据,用map集合来保存
	 * @param templateName word模板名称,例如:test.ftl
	 * @param filePath 文件生成的目标路径,例如:D:/wordFile/
	 * @param fileName 生成的文件名称,例如:test.doc
	 */
	@SuppressWarnings("unchecked")
	public static File createWord(Map dataMap, String templateName, String filePath, String fileName){
		try {
			//创建配置实例
			Configuration configuration = new Configuration();

			//设置编码
			configuration.setDefaultEncoding("UTF-8");

			//ftl模板文件统一放至 com.lun.template 包下面
			configuration.setClassForTemplateLoading(FreeMarkerUtil.class,"/templates/ftl");

			//获取模板
			Template template = configuration.getTemplate(templateName);

			//输出文件
			File outFile = new File(filePath+ File.separator+fileName);

			//如果输出目标文件夹不存在,则创建
			if (!outFile.getParentFile().exists()){
				outFile.getParentFile().mkdirs();
			}

			//将模板和数据模型合并生成文件
			Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
			//生成文件
			template.process(dataMap, out);

			//关闭流
			out.flush();
			out.close();

			return outFile;
		} catch (Exception e) {
			e.printStackTrace();
		    return null;
		}

	}

	/**
	 * @Desc:生成word文件
	 * @param dataMap word中需要展示的动态数据,用map集合来保存
	 * @param templateName word模板名称,例如:test.ftl
	 * @param filePath 文件生成的目标路径,例如:D:/wordFile/
	 * @param fileName 生成的文件名称,例如:test.doc
	 */
	@SuppressWarnings("unchecked")
	public static String createWord(Map dataMap, String templateName, String filePath, String fileName,String nginx){
		try {
			//创建配置实例
			Configuration configuration = new Configuration();

			//设置编码
			configuration.setDefaultEncoding("UTF-8");

			//ftl模板文件统一放至 com.lun.template 包下面
			configuration.setClassForTemplateLoading(FreeMarkerUtil.class,"/templates/ftl");

			//获取模板
			Template template = configuration.getTemplate(templateName);

			//输出文件
			File outFile = new File(filePath+ File.separator+fileName);

			//如果输出目标文件夹不存在,则创建
			if (!outFile.getParentFile().exists()){
				outFile.getParentFile().mkdirs();
			}

			//将模板和数据模型合并生成文件
			Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
			//生成文件
			template.process(dataMap, out);

			//关闭流
			out.flush();
			out.close();

			return nginx+File.separator+fileName;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * 自动闭合标签
	 * @param html
	 * @return
	 */
	public static String closeHTML(String html){

		if(StringUtils.isEmpty(html)){
			return html;
		}

		String[] arrTags = {"img"};
		StringBuffer str = new StringBuffer(html);
		Map<String,String> repMap = new HashMap<String,String>();
		for(int i = 0;i<arrTags.length; i++){

			String regex = "<"+arrTags[i] +"( [^\\<\\>]+|)\\>";
			Matcher matcher = Pattern.compile(regex).matcher(html);
			while (matcher.find()){
				String reStr = html.substring(matcher.start(),matcher.end());
				if(reStr.indexOf("/>") > 0){
					reStr = reStr.replaceAll("/>",">");
				}
				repMap.put(reStr,reStr+"</"+arrTags[i]+">");
			}
		}

		for (String key:repMap.keySet()) {
			html = html.replaceAll(key,repMap.get(key));
		}

		return html;
	}

	/**
	 * 字符串去除html标签
	 * @param html
	 * @return
	 */
	public static String delHtmlTag(String str){
		String newstr = "";
		newstr = str.replaceAll("<[.[^>]]*>","");
		newstr = newstr.replaceAll(" ", "");
		return newstr;
	}

}

 Maven

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
      <version>2.1.18.RELEASE</version>
    </dependency>

 

三、测试调用

 

五、 查看文件

在实现类中指定了保存文件的地址【/usr/local/nfs/tmp/word】,去找到文件打开看看

 

PS:开发成长过程中记录一下,如有问题欢迎指正;具体逻辑具体处理,这里只做演示

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值