ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用freemark 生成word形式

2019-05-14 10:54:40  阅读:386  来源: 互联网

标签:安丘 word userMap freemark 生成 put new response dataMap


这是需求:需要做一张这样的word文件,需要用freemark自动下载生成
xu
1打开这个word文件或者自制一张这样的word文件将其加入字段
在这里插入图片描述
这里需要空一行空白,这里需要做之后数据并没有填充完整个表格的留白。完了之后将其保存为xml格式,
在这里插入图片描述

2 .将xml格式文件,手动改成ftl格式文件
在这里插入图片描述
3,然后将这个ftl格式文件导入到foxechs里面进行字段修改,这款软件针对ftl格式文件非常好用
在这里插入图片描述
4,打开后,右键缩进排版。然后找到里面之前编辑的字段 比如“day"字段

在这里插入图片描述
foxechs软件打开后会有错误比如把”day"字段分开成了<w:t>d</w:t>和<w:t>ay</w:t>
我们需要把这些分开的字段合并<w:t>day</w:t>
然后加上需要的特殊符号<w:t>${day}</w:t>
将所有字段做一次这样的修改后保存。

5下面就是导入项目中作为模板了。我这里用的是springboot,额外要加入pom文件freemark的

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.20</version>
    </dependency>

这里用的是2.3.20版本;

6将刚刚整理好的ftl文件插入spring静态文件中
在这里插入图片描述
然后再springboot里面的cotroller层里面下业务代码
这里是基于下载方法生成word

@RestController
public class TestController25 {

// 处理下载word文档
@RequestMapping("/MeasuringTable11")
public void downloadWord(HttpServletRequest request, HttpServletResponse response) throws Exception {
    try {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/msword");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename=表7 钢弦式多点位移计监测记录、计算表.doc");
        Map<String, Object> dataMap = this.getData();
        //创建配置实例对象
        Configuration configuration = new Configuration();
        //设置编码
        configuration.setDefaultEncoding("UTF-8");
        //加载需要装填的模板
        configuration.setClassForTemplateLoading(this.getClass(), "/");
        //设置对象包装器
        configuration.setObjectWrapper(new DefaultObjectWrapper());
        //设置异常处理器
        configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
        //获取ftl模板对象
        Template template = configuration.getTemplate("MeasuringTable7.ftl");
        //输出文档
        String fileName="表7 钢弦式多点位移计监测记录、计算表.doc";
        try {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename="
                    + new String(fileName.toString().getBytes("GBK"), "ISO-8859-1"));
            response.setCharacterEncoding("utf-8");//处理乱码问题
            //生成Word文档
            template.process(dataMap, response.getWriter());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.flushBuffer();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//getData方法被调用
private Map<String, Object> getData() {
    Map<String, Object> dataMap = new HashMap<>();
    //基础数据
    dataMap.put("measuringNumber", "l安丘");
    dataMap.put("measuringElevation", "刘飞");
    dataMap.put("frequencyValueOne", "l安丘");
    dataMap.put("frequencyValueTwo", "l安丘");
    dataMap.put("frequencyValueThree", "l安丘");
    dataMap.put("frequencyValueFour", "l安丘");
    dataMap.put("frequencyValueFive", "l安丘");
    dataMap.put("frequencyValueSix", "l安丘");
    dataMap.put("sensitivityCoefficientGone", "刘飞");
    dataMap.put("sensitivityCoefficientGtwo", "刘飞");
    dataMap.put("sensitivityCoefficientGthree", "刘飞");
    dataMap.put("sensitivityCoefficientGfour", "刘飞");
    dataMap.put("sensitivityCoefficientGfive", "刘飞");
    dataMap.put("sensitivityCoefficientGsix", "刘飞");
    dataMap.put("year", "1998");
    dataMap.put("page", "6");
    //1.创建有数据的单元格行list
   List<Map<String, Object>> measuringData = new ArrayList<>();
   int x=5;//从数据库里面一次读到数据的数量,这里假设是16个
   for (int i = 1; i <= x; i++) {
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("day", "张三" + i);
        userMap.put("temperatureT", "1");
        userMap.put("frequencyone", "1");
        userMap.put("frequencytwo", "1");
        userMap.put("frequencythree", "1");
        userMap.put("frequencyfour", "1");
        userMap.put("frequencyfive", "1");
        userMap.put("frequencysix", "1");
        userMap.put("displacementOne", "1");
        userMap.put("displacementTwo", "1");
        userMap.put("displacementThree", "1");
        userMap.put("displacementFour", "1");
        userMap.put("displacementFive", "1");
        userMap.put("displacementSix", "1");
        measuringData.add(userMap);
    }
    dataMap.put("measuringData", measuringData);
    //2.创建有数据的单元格行list
    List<Map<String,Object>>blankList=new ArrayList<>();
    int tablePage=x/7;
	for(int i=1;i<=7*(tablePage+1)-x;i++) {
		HashMap<String,Object> blankHashMap = new HashMap<>();
		blankList.add(blankHashMap);
	}
   dataMap.put("blank", blankList);
    
  return dataMap;
}

}

标签:安丘,word,userMap,freemark,生成,put,new,response,dataMap
来源: https://blog.csdn.net/qq_43077857/article/details/90201648

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有