Java 创建Word文档时文件已损坏

Java 创建Word文档时文件已损坏,java,xml,docx4j,Java,Xml,Docx4j,我对docx4j很陌生。安装完所有内容后,我尝试创建一个空的.docx文件,然后在其中写入文本。代码如下: WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello Word!"); wordMLPackage.save(new java.io.File("HelloWo

我对docx4j很陌生。安装完所有内容后,我尝试创建一个空的.docx文件,然后在其中写入文本。代码如下:

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello Word!");
wordMLPackage.save(new java.io.File("HelloWord1.docx"));
该文件已成功创建,但当我尝试使用Word 2010打开它时,会收到一条错误消息,表示该文件已损坏。然而,当我用写字板打开它时,一切都很好,文本就在那里。如何解决此问题并使用Word 2010打开创建的文档

编辑:我将损坏的文件转换为zip,下面是document.xml:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<w:document mc:Ignorable="w14 w15" xmlns:ns32="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:ns31="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:ns30="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:odi="http://opendope.org/components" xmlns:oda="http://opendope.org/answers" xmlns:odq="http://opendope.org/questions" xmlns:odc="http://opendope.org/conditions" xmlns:odx="http://opendope.org/xpaths" xmlns:ns23="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:ns21="urn:schemas-microsoft-com:office:powerpoint" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ns17="urn:schemas-microsoft-com:office:excel" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:ns12="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:ns9="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">


-<w:body>


-<w:p w14:textId="bde3dbce" w14:paraId="bde3dbce">


-<w:pPr>

<w15:collapsed w:val="false"/>

</w:pPr>


-<w:r>

<w:t>Hello Word!</w:t>

</w:r>

</w:p>


-<w:sectPr>

<w:pgSz w:w="12240" w:code="1" w:h="15840"/>

<w:pgMar w:left="1440" w:bottom="1440" w:right="1440" w:top="1440"/>

</w:sectPr>

</w:body>

</w:document>

-
-
-
-
-
你好,字!
-

编辑2:为了解决这个问题,我费了好几个小时的脑筋,完全卸载并删除了对docx4j的所有引用,重新添加了JAR文件。出于某种原因,在那之后就没有问题了。

我使用当前稳定的docx4j(v3.1)版本运行了这段代码,没有任何问题。在MS Word 2010中创建并打开了一个文档。下面是我的测试类的完整内容,它在我的C驱动器中的“test”目录中创建了一个Word文件(显然是根据您的机器/操作系统进行调整):

更新XML检查了您提供的
document.XML
文件内容后,问题在于其中的XML声明。目前,它在Word中抛出了一个损坏的文档错误。Word还告诉您问题所在(第54列第1行中的错误)。如果删除
standalone=“true”
属性,然后将已编辑的
document.xml
粘贴回zip文件,它将打开而不会出现任何问题

这就提出了一个问题,为什么生成的文件包含这个声明(它不应该包含,而且我认为正确的值在任何情况下都是
standalone=“yes”
)。答案必须取决于Java实现中使用的XML转换器


(你可以在这里阅读更多关于这个声明的内容:)。

这真的很奇怪。该文件已创建,而且似乎很好,因为WordPad可以毫无问题地打开它。这可能是我的微软Word版本吗?我尝试清理项目,重新启动Eclipse和计算机。。。因为这似乎不是一个代码问题,我真的不知道如何解决这个问题。奇怪。我在Word 2010中打开了该文件。您使用的是什么版本的docx4j?你的代码有错误捕获吗?您可以做一件事:将文件扩展名更改为.zip,打开zip,打开其中的“word”文件夹,然后提取
document.xml
——将该文件的内容作为代码粘贴到原始问题中,我会看一看——如果该文件真的损坏,应该可以从中看出。我还运行了最新版本的docx4j。你所说的错误捕获是什么意思?我粘贴了document.xml的内容,希望您能从中找到解决方案。好的,找到问题的根源——请参阅更新的答案。非常感谢您的帮助Ben!下面的答案可能就是我问题的解决方案。但是有人知道如何通过编程更改XML文件中的独立属性吗?任何解决办法都将不胜感激。。。
public class PlayDocx4J {

    public static void main(String[] args) {

        try {
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
            wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello Word!");
            wordMLPackage.save(new java.io.File("c:/test/helloword.docx"));
        } catch (Docx4JException e) {
            System.err.println("ERROR " + e.getMessage());
            e.printStackTrace();
        }
    }
}