用freemark 生成word形式

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

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

用freemark 生成word形式
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静态文件中
用freemark 生成word形式
然后再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;
}

}

上一篇:测试平台系列(28) 编写用例详情页(3)


下一篇:Spring下面的@Transactional注解的讲解