Freemarker模板静态化
作者:互联网
需求:
使用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