# 简介
生成复杂的 word 文档需要使用 xml 格式的 word 模板,但是另存为 xml 文件的 word 文件格式比较杂乱。现提供一个格式化 xml 的工具类,代码如下:
package xxx.util; | |
import cn.hutool.core.io.FileUtil; | |
import cn.hutool.core.io.file.FileAppender; | |
import cn.hutool.core.io.file.FileReader; | |
import java.util.List; | |
public class WordConvertXmlHandle { | |
public static void main(String[] args) { | |
// 文件读取 - FileReader | |
// 默认 UTF-8 编码,可以在构造中传入第二个参数作为编码 | |
FileReader fileReader = new FileReader("D:\\mb.xml"); | |
// 从文件中读取每一行数据 | |
List<String> strings = fileReader.readLines(); | |
// 文件追加 - FileAppender | |
//destFile – 目标文件 | |
//capacity – 当行数积累多少条时刷入到文件 | |
//isNewLineMode – 追加内容是否为新行 | |
FileAppender appender = new FileAppender(FileUtil.newFile("D:\\mb.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(); | |
} | |
} |