ICode9

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

Freemarker模板静态化

2022-03-08 16:03:33  阅读:456  来源: 互联网

标签:xml return String Freemarker 静态 base64 param new 模板


需求:

使用Freemarker模板静态化技术根据word模板生成word文档

开发步骤:

  • 一、处理word模板,先将word文档中需要动态赋值的部分替换成${变量名}的格式,然后将文件另存为xml文档(这里需要注意的是在另存为xml的时候有两个选项,一种是Word XML 文档(.xml)另一种是 Word 2003 XML文档(.xml),这里我们选择2003的,原因是如果选择了非2003的在处理xml文件以后再打开会报错(Word 在xxx.doc中发现无法读取的内容。是否恢复此文档的内容?如果您信任此文档的来源,请单击"是"。)而2003的就没有问题。另存为xml以后使用idea工具(我使用的是idea,使用哪个工具随意)打开xml文件格式化一下代码,然后找到你在word时候创建的那些变量,一般在你另存为xml的时候${变量名}会被一些标签分隔开,直接将${变量名}中的多余字符删除即可。还有就是文档中的图片在另存为xml的时候会变成base64位的字节码文件,我们直接删除替换成我们后台要传来的值就可以了。xml文档处理完成以后将*.xml后缀改成 *.ftl就可以了。
  • 二、处理完成以后就可以在代码中根据处理好的模板生成word文档了。

代码:

Freemarker工具类

/**
 * Freemarker工具类
 */
public class FreemarkerUtil {
    /**
     * 生成word文件
     *
     * @param dataMap      word中需要展示的动态数据,用map集合来保存
     * @param templatePath word模板路径
     * @param templateName word模板名称,例如:model.ftl
     * @param filePath     文件生成的目标路径,例如:E:\\freemarker
     * @param fileName     生成的文件名称,例如:Test.doc
     */
    public static void createWord(Map dataMap, String templatePath, String templateName, String filePath, String fileName) {
        try {
            //创建配置实例
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);

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

            //ftl模板文件
            configuration.setDirectoryForTemplateLoading(new File(templatePath));
            //获取模板
            Template template = configuration.getTemplate(templateName, String.valueOf(StandardCharsets.UTF_8));

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

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

            //将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));

            //生成文件
            template.process(dataMap, out);

            //关闭流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

图片转base64格式工具类

/**
 * @Author: Lyh
 * @Date: 2022/3/8
 * @Description: 将 本地/网络 图片转为base64格式
 */
public class Base64Helper {
    /**
     * 编码
     *
     * @param byteArray
     * @return
     */
    public static String encode(byte[] byteArray) {
        return new String(new Base64().encode(byteArray));
    }

    /**
     * 解码
     *
     * @param base64EncodedString
     * @return ss
     */
    public static byte[] decode(String base64EncodedString) {
        return new Base64().decode(base64EncodedString);
    }


    /**
     * 本地图片转换成base64字符串
     *
     * @param imgFile 图片对象
     * @return
     */
    public static String imageToBase64ByLocal(File imgFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;

        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);

            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        String base64Str = encoder.encode(data);
        // 替换base64后的字符串中的回车换行 然后返回Base64编码过的字节数组字符串
        return base64Str.replaceAll("(\r\n|\r|\n|\n\r)", "");
    }

    /**
     * 本地图片转换成base64字符串
     *
     * @param imgFilePath 本地图片存放路径
     * @return
     */
    public static String imageToBase64ByLocal(String imgFilePath) {
        return imageToBase64ByLocal(new File(imgFilePath));
    }

    /**
     * 在线图片转换成base64字符串
     *
     * @param imgURL 图片线上路径
     * @return
     */
    public static String imageToBase64ByOnline(String imgURL) {
        ByteArrayOutputStream data = new ByteArrayOutputStream();
        try {
            // 创建URL
            URL url = new URL(imgURL);
            byte[] by = new byte[1024];
            // 创建链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            InputStream is = conn.getInputStream();
            // 将内容读取内存中
            int len = -1;
            while ((len = is.read(by)) != -1) {
                data.write(by, 0, len);
            }
            // 关闭流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data.toByteArray());
    }

    /**
     * base64字符串转换成图片
     * 对字节数组字符串进行Base64解码并生成图片
     *
     * @param imgStr      base64字符串
     * @param imgFilePath 图片存放路径
     * @return
     */
    public static boolean base64ToImage(String imgStr, String imgFilePath) {
        // 图像数据为空
        if (StringUtils.isEmpty(imgStr)) {
            return false;
        }

        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr.replace("data:image/png;base64,", ""));
            for (int i = 0; i < b.length; ++i) {
                // 调整异常数据
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }

            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
 

测试:

@Test
void ceShi() throws IOException {
    FreemarkerUtil.createWord(map, templatePath, templateName, filePath, fileName);
}

结语:

到这里关于Freemarker模板静态化的文章就写完了,我个人觉得需要注意的就是文档在另存为的时候不要选错了是2003格式的xml。

标签:xml,return,String,Freemarker,静态,base64,param,new,模板
来源: https://www.cnblogs.com/liyh123456/p/15980814.html

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

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

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

ICode9版权所有