使用FreeMarker自定义生成word文档

使用FreeMarker自定义生成word文档

最终生成word文档如下:
使用FreeMarker自定义生成word文档_第1张图片

实现思路:
  1. 按照要生成的文档模板格式,创建一个新的word(doc)文档,将其调整成所需格式,然后处理其中需要动态填充的数据,如下:
    使用FreeMarker自定义生成word文档_第2张图片
  2. 将该word文档另存为Word 2003 XML 文档(*.xml)格式,然后将其后缀改为.ftl
  3. 此时该.ftl文件里的内容格式可能不规范,规范其内容,例如:”${map.projectName}“中间可能被其他字符给分隔。所以要把中间的无用字符给删掉;
  4. 最后生成的文件可能长这样:
    使用FreeMarker自定义生成word文档_第3张图片
功能实现:

模板已经写好,现在就是后端代码实现了。

	/**
     * 生成word
     * @param projectInformation	该课题信息对象
     * @param dir	要生成的word的存储路径
     * @return
     * @throws Exception
     */
    public static String exportWord(ProjectInformation projectInformation, String dir){

        File file = new File(dir);
        if (!file.exists()){
            file.mkdirs();
        }
        Configuration conf = new Configuration();
        conf.setDefaultEncoding("UTF-8");
        //加载模板文件(模板的路径)
        conf.setDirectoryForTemplateLoading(new File(dir));
        // 加载模板
        String separator = File.separator;
        Template template = conf.getTemplate("templatePrint.ftl");
        template.setEncoding("UTF-8");
        // 定义数据
        Map root = new HashMap();

        Map<String, Object> map = new HashMap<>();
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("projectName",projectInformation.getName());
        }else {
            map.put("projectName","");
        }
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("projectNumber", projectInformation.getNumber());
        }else {
            map.put("projectNumber","");
        }
        if (StringUtils.isNotBlank(projectInformation.getName())){
            map.put("serialNumber",projectInformation.getSerial());
        }else {
            map.put("serialNumber","");
        }

        SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
        String currentTime = sf.format(new Date());
        map.put("currentTime",currentTime);
        root.put("map",map);

        // 定义输出
        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");//设置日期格式
        String date = f.format(new Date(System.currentTimeMillis()));
        Random random = new Random();
        int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数
        String fileName = date+rannum+"标签.doc";
        //判断文件夹是否存在,不存在则创建
        File fileDir = new File(HtmlUtil.getAppDir()+separator+"Template");
        if (!fileDir.exists()){
            fileDir.mkdirs();
        }
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(HtmlUtil.getAppDir()+separator+"Template" + separator+fileName),"UTF-8"));
        template.process(root, out);
        out.flush();
        out.close();
        return fileName;
    }    
    
##### 补充:
如果要生成的文档里面包含表格,怎么循环放置数据?

你可能感兴趣的:(word,c#,开发语言)