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