当前位置: 首页 > 知识库问答 >
问题:

Docx4j测试-不输出文件

纪秋月
2023-03-14

尝试用docx4j(http://www.docx4java.org)编写我的第一个类。基本上,这个想法是在。docx文件中找到一个文本字符串,并用另一个文本字符串替换它。本质上是邮件合并。虽然我没有收到任何错误,但合并的文档本身没有保存在我建议的路径中。这让我认为这是一个文件路径问题,但我没有看到任何问题。

package efi.mailmerge.servlets;

import java.util.List;
import javax.xml.bind.JAXBElement;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.Text;

public class WordDocTest {

    /**
     * Open word document /Users/Jeff/Development/ReServe-Unleashed/Dev/MailMerge/uploads/Sample.docx, replace a piece of text and save
     * the result to /Users/Jeff/Development/ReServe-Unleashed/Dev/MailMerge/uploads/Sample-Out.docx.
     *
     * The text <<CUS_FNAME>> will be replaced with John.
     *
     * @param args
     */
    public static void main(String[] args) {

        // Text nodes begin with w:t in the word document
        final String XPATH_TO_SELECT_TEXT_NODES = "//w:t";

        try {
            // Open the input file
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File("/Users/Jeff/Development/ReServe-Unleashed/Dev/MailMerge/uploads/Sample.docx"));

            // Build a list of "text" elements
            List texts = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);

            // Loop through all "text" elements
            for (Object obj : texts) {
                Text text = (Text) ((JAXBElement) obj).getValue();

                // Get the text value
                String textValueBefore = text.getValue();

                // Perform the replacement
                String textValueAfter = textValueBefore.replaceAll("<<CUS_FNAME>>", "John");

                // Show the element before and after the replacement
                System.out.println("textValueBefore = " + textValueBefore);
                System.out.println("textValueAfter = " + textValueAfter);

                // Update the text element now that we have performed the replacement
                text.setValue(textValueAfter);

            }

            wordMLPackage.save(new java.io.File("/Users/Jeff/Development/ReServe-Unleashed/Dev/MailMerge/uploads/Sample-Out.docx"));

        } catch (Docx4JException e) {
            Logger.getLogger(WordDocTest.class.getName()).log(Level.SEVERE, null, e);
            e.printStackTrace();
        } catch (Exception e) {
            Logger.getLogger(WordDocTest.class.getName()).log(Level.SEVERE, null, e);
            e.printStackTrace();
        }
    }

}

在第26和50行,您可以看到输入/输出路径。我已经确认sample.docx输入文件确实存在,并且上传目录具有写权限。你能看到我的文件路径有什么问题吗?我可能完全走错了路,但这对我来说都是非常新的,所以我边走边学。

我们非常感谢您的帮助。

共有1个答案

夏昊
2023-03-14

乍一看,我会建议尝试用以下方式写出你的路径:

wordMLPackage.save(new java.io.File("\\Users\\Jeff\\Development\\ReServe-Unleashed\\Dev\\MailMerge\\uploads\\Sample-Out.docx"));

如果仍然不能工作,请提供堆栈跟踪?可能会有帮助。(如果没有保存文档,则必须抛出异常

 类似资料:
  • 当一个批处理任务写入数据库的时候,很容易去查询数据去验证结果是否如预期一样。然而,如果批处理任务写入一个文件,验证输出量同样重要。Spring Batch 提供了一个类AssertFile使输出文件的验证变得容易。assertFileEquals方法带了两个文件对象(或者是两个资源对象)和断言,一行一行的,两个文件有相同的上下文。因此,它可能创建了一个文件,有预期的输出和对比之后返回的真实结果:

  • 问题 你的程序中有个方法会输出到标准输出中(sys.stdout)。也就是说它会将文本打印到屏幕上面。 你想写个测试来证明它,给定一个输入,相应的输出能正常显示出来。 解决方案 使用 unittest.mock 模块中的 patch() 函数, 使用起来非常简单,可以为单个测试模拟 sys.stdout 然后回滚, 并且不产生大量的临时变量或在测试用例直接暴露状态变量。 作为一个例子,我们在 my

  • 安装程序:我有一个扩展IRetryAnalyzer的类,并实现了一个简单的重试逻辑,覆盖了以下方法:public boolean retry(ITestResult result){ 提前道谢。

  • 我编写了一个自定义的Hamcrest与一起使用。 我不需要知道如何编写代码来生成数字或语法,我只需要知道把它放在哪里。

  • 问题内容: 我只有一种方法。如何检查System.out.println()并将Scanner替换为使用JUnit自动输入值? PS,请提供一些解决方案… 问题答案: 理想情况下,提取尴尬的依赖关系,以便您可以在没有依赖关系的情况下进行测试。更改为简单: (考虑使用a 代替for 。) 然后,您实际上不需要进行单元测试-但您可以使用基于的进行测试,并基于的输出进行测试,从而提供所需的任何输入并检查