创建Word文档时损坏的文件

时间:2014-06-18 09:04:40

标签: java xml docx4j

我对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文件。出于某种原因,之后不再有问题。

1 个答案:

答案 0 :(得分:0)

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

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

更新re XML 检查了您提供的document.xml文件内容,问题在于那里的XML声明。就目前而言,它会在Word中引发损坏的文档错误。 Word还会告诉您问题所在(第1行第54列中的错误)。如果您删除了standalone="true"属性,然后将已修改的document.xml粘贴回zip文件,它将打开,没有任何问题。

这引发了为什么生成的文件包含此声明的问题(它不应该,并且我认为在任何情况下正确的值都是standalone="yes")。答案必须在于Java实现中使用的XML转换器。

(您可以在此处阅读有关此声明的更多信息:http://www.xmlplease.com/xml/xmlquotations/standalone)。