文章目录


文章目录

前言

一、下载

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;
}

也就是文件头标签没有占位符。因为没有格式化(之前说到的不要格式化,方便数据操作),有‘$’占位符的所有数据都在一行中。

word转xml格式 java 参数为文件对象 word转xml问题_freemaker

将一行数据中所有包含‘$’占位符的字符串替换为'#$'字符串,然后以'#'再切割得到所有'$'占位符开头的行数据(数组)

//如果一行数据中包含'$'变量符将替换为'#$'
string = string.replaceAll("\\$", "#\\$");
//然后以'#'切割成每一行(数组),这样一来'$'都将在每一行的开头
String[] ss = string.split("#");

word转xml格式 java 参数为文件对象 word转xml问题_word转pdf_02

word转xml格式 java 参数为文件对象 word转xml问题_xml_03

不是以‘$’占位符开头的)

//暂存数据
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));

word转xml格式 java 参数为文件对象 word转xml问题_freemaker_04

word转xml格式 java 参数为文件对象 word转xml问题_后端_05

word转xml格式 java 参数为文件对象 word转xml问题_后端_06

结语

不好用回来直接砍我,好用回来记得给我点赞!!!