Java 如何正确评估Velocity上下文?

Java 如何正确评估Velocity上下文?,java,velocity,vtl,Java,Velocity,Vtl,我是Apache Velocity的新手,我想知道评估上下文的正确方法是什么。以下是我的情况: 我想打开一个用作模板的.docx文件,用Apache-Velocity替换其中的一些单词,然后将结果保存在一个新的.docx文件中。为此,我的代码如下: public static void main(String[] args) { Velocity.init(); final VelocityContext context = new VelocityContext()

我是Apache Velocity的新手,我想知道评估上下文的正确方法是什么。以下是我的情况:

我想打开一个用作模板的
.docx
文件,用
Apache-Velocity
替换其中的一些单词,然后将结果保存在一个新的
.docx
文件中。为此,我的代码如下:

    public static void main(String[] args) {

    Velocity.init();

    final VelocityContext context = new VelocityContext();
    context.put("city", "Firenze");
    context.put("user", "Federico");
    context.put("date", "23/09/20");
    context.put("op", "Mario Rossi");
    ArrayList<String> list = new ArrayList<String>();
    list.add("Data futura");
    list.add("Scrittura indecifrabile");
    context.put("list", list);

    String name = "tempWord.docx";
    List<XWPFParagraph> paragraphs;

    try {
        paragraphs = readDocxFile(name);
        XWPFDocument doc = new XWPFDocument();
        final FileOutputStream fos = new FileOutputStream(new File("outFile.docx"));

        for(XWPFParagraph para : paragraphs) {
            StringWriter sw = new StringWriter();
            System.out.println(para.getText());
            Velocity.evaluate(context, sw, "test1", para.getText());
            XWPFParagraph par = doc.createParagraph();
            XWPFRun run = par.createRun();
            run.setText(sw.toString());
        }
        doc.write(fos);
        fos.close();

    } catch(Exception rnfe) {
        rnfe.printStackTrace();
    }

}
我得到这个错误

    1606 [main] ERROR org.apache.velocity.parser - test1: Encountered "<EOF>" at line 1, column 29.
1606[main]错误org.apache.velocity.parser-test1:在第1行第29列遇到“”。
它发生在解析
#foreach
循环时,似乎与
Velocity.evaluate()
方法有关,因为如果创建
tmp.txt
文件并将其与
Velocity.mergeTemplate()
方法一起用作Velocity模板,代码将正确运行。这种方法的问题是,我不想每次必须计算上下文时都存储
.txt
,而且我必须保持原始文件格式

据我所知,
evaluate()
逐行求值,显然
#foreach
块的求值不正确

我知道
apachepoi
也可以执行上下文替换以及
docx4j
,但我必须使用Velocity


如何正确评估上下文?

我会尝试使用自定义分隔符合并所有段落,然后在该分隔符上拆分结果以重建段落。大致如下:

try {
    paragraphs = readDocxFile(name);
    XWPFDocument doc = new XWPFDocument();
    final FileOutputStream fos = new FileOutputStream(new File("outFile.docx"));

    StringWriter sw = new StringWriter();
    String separator = "_PARA_";
    for(XWPFParagraph para : paragraphs) {
        System.out.println(para.getText());
        sw.append(para.getText());
        sw.append(separator);
    }

    StringWriter rst = new StringWriter();
    Velocity.evaluate(context, rst, "test1", sw.toString);
    
    for (String para : rst.toString().split(separator))
        XWPFParagraph par = doc.createParagraph();
        XWPFRun run = par.createRun();
        run.setText(para);
    }
    doc.write(fos);
    fos.close();

} catch(Exception rnfe) {
    rnfe.printStackTrace();
}
不过,您可能知道,通过将前后段落转换为这样的文本,您很容易受到松散格式标记的影响,更不用说标题、表格、枚举等了。不过,对于标准正文文本,它应该可以正常工作

try {
    paragraphs = readDocxFile(name);
    XWPFDocument doc = new XWPFDocument();
    final FileOutputStream fos = new FileOutputStream(new File("outFile.docx"));

    StringWriter sw = new StringWriter();
    String separator = "_PARA_";
    for(XWPFParagraph para : paragraphs) {
        System.out.println(para.getText());
        sw.append(para.getText());
        sw.append(separator);
    }

    StringWriter rst = new StringWriter();
    Velocity.evaluate(context, rst, "test1", sw.toString);
    
    for (String para : rst.toString().split(separator))
        XWPFParagraph par = doc.createParagraph();
        XWPFRun run = par.createRun();
        run.setText(para);
    }
    doc.write(fos);
    fos.close();

} catch(Exception rnfe) {
    rnfe.printStackTrace();
}