文章目录
文章目录
前言
一、下载
1.引入强大的工具包
2.或者下载工具包
二、使用步骤
1.代码(复制即用)
2.代码讲解
结语
前言
在用freemaker模板的时候,第一步都会将word转换为xml格式文件,解析成xml文件经常会出现(个别、很多)字段占位符、变量值被分离,被分离的字段少的还好能手动改改,字段多了能让你直接发疯,接下来给大家讲解一个脚本轻松解决占位符、变量值被分离的问题,解决你的痛苦。(复制即用)
一、下载
1.引入强大的工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.11</version>
</dependency>
2.或者下载工具包
hutool工具类库
二、使用步骤
word转换为xml之后直接转换为ftl文件,中途不要操作什么!(不要用xml插件调整格式)
1.代码(复制即用)
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileAppender;
import cn.hutool.core.io.file.FileReader;
import java.util.List;
/**
* 将分离的占位符去除、变量值重新拼装
* 执行自动完成
* @author luvJie-7c
* @date 2022-7-28
*/
public class text {
public static void main(String[] args) {
//文件读取-FileReader
//默认UTF-8编码,可以在构造中传入第二个参数作为编码
FileReader fileReader = new FileReader("F:\\日常工作\\你的模板.ftl");
//从文件中读取每一行数据
List<String> strings = fileReader.readLines();
//文件追加-FileAppender
//destFile – 目标文件
//capacity – 当行数积累多少条时刷入到文件
//isNewLineMode – 追加内容是否为新行
FileAppender appender = new FileAppender(FileUtil.newFile("F:\\日常工作\\新生成的模板.ftl"), 16, true);
//遍历得到每一行数据
for (String string : strings) {
//判断每一行数据中不包含'$'的数据先添加进新文件
if (!string.contains("$")) {
appender.append(string);
continue;
}
//如果一行数据中包含'$'变量符将替换为'#$'
string = string.replaceAll("\\$", "#\\$");
//然后以'#'切割成每一行(数组),这样一来'$'都将在每一行的开头
String[] ss = string.split("#");
// 同一行的数据写到同一行,文件追加自动换行了(最后的完整数据)
StringBuilder sb = new StringBuilder();
//遍历每一行(数组ss)
for (int i = 0; i < ss.length; i++) {
//暂存数据
String s1 = ss[i];
//将不是以'$'开头的行数据放进StringBuilder
if (!s1.startsWith("$")) {
sb.append(s1);
continue;
}
//被分离的数据一般都是'${'这样被分开
//匹配以'$'开头的变量找到'}' 得到索引位置
int i1 = s1.lastIndexOf("}");
//先切割得到这个完整体
String substr = s1.substring(0, i1 + 1);
//把变量追加到StringBuilder
sb.append(substr.replaceAll("<[^>]+>", ""));
//再将标签数据追加到StringBuilder包裹变量
sb.append(s1.substring(i1 + 1));
}
appender.append(sb.toString());
}
appender.flush();
appender.toString();
}
}
2.代码讲解
读取你的ftl文件每一行,strings就是读取到的数据,然后创建一个输出文件
//文件读取-FileReader
//默认UTF-8编码,可以在构造中传入第二个参数作为编码
FileReader fileReader = new FileReader("F:\\日常工作\\你的模板.ftl");
//从文件中读取每一行数据
List<String> strings = fileReader.readLines();
//文件追加-FileAppender
//destFile – 目标文件
//capacity – 当行数积累多少条时刷入到文件
//isNewLineMode – 追加内容是否为新行
FileAppender appender = new FileAppender(FileUtil.newFile("F:\\日常工作\\新生成的模板.ftl"), 16, true);
遍历被读取到的每一行,并进行判断。如果一行中没有匹配到‘$’占位符就将数据追加到新文件。
//判断每一行数据中不包含'$'的数据先添加进新文件
if (!string.contains("$")) {
appender.append(string);
continue;
}
也就是文件头标签没有占位符。因为没有格式化(之前说到的不要格式化,方便数据操作),有‘$’占位符的所有数据都在一行中。
将一行数据中所有包含‘$’占位符的字符串替换为'#$'字符串,然后以'#'再切割得到所有'$'占位符开头的行数据(数组)
//如果一行数据中包含'$'变量符将替换为'#$'
string = string.replaceAll("\\$", "#\\$");
//然后以'#'切割成每一行(数组),这样一来'$'都将在每一行的开头
String[] ss = string.split("#");
不是以‘$’占位符开头的)
//暂存数据
String s1 = ss[i];
//将不是以'$'开头的行数据放进StringBuilder
if (!s1.startsWith("$")) {
sb.append(s1);
continue;
}
如果找到了以'$'占位符开头的字符串进行分割得到完整变量再添加进StringBuilder,然后去取刚刚暂存的数据,切割掉前面的变量数据,将标签追加到StringBuilder。
//被分离的数据一般都是'${'这样被分开
//匹配以'$'开头的变量找到'}' 得到索引位置
int i1 = s1.lastIndexOf("}");
//先切割得到这个完整体
String substr = s1.substring(0, i1 + 1);
//把变量追加到StringBuilder
sb.append(substr.replaceAll("<[^>]+>", ""));
//再将标签数据追加到StringBuilder包裹变量
sb.append(s1.substring(i1 + 1));
结语
不好用回来直接砍我,好用回来记得给我点赞!!!