【问题标题】:Converting XML to Word Document将 XML 转换为 Word 文档
【发布时间】:2015-06-03 09:55:36
【问题描述】:

我有一个结构正确的单词生成的 xml 文件 (2007)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
    <pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
        <!-- content... -->
    </pkg:package>

使用Apache Poi,我想生成对应的XWPFDocument

            try {
                //strXML is the xml content
                File xmlGenFile = new File("./sampleFile.xml");
                FileWriter fw = new FileWriter(xmlGenFile);
                fw.write(strXML);
                fw.close();
                OPCPackage oPack = OPCPackage.open(xmlGenFile);
                XWPFDocument doc = new XWPFDocument(oPack);

            } catch (ContentIOException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvalidFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

我尝试使用OPCPackage.open 方法,但我得到org.apache.poi.openxml4j.exceptions.InvalidOperationException

org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '.\sampleFile.xml'
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:131)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:246)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:200)
    at tn.com.st2i.service.impl.TemplatingServiceImpl.generateWordDocument(TemplatingServiceImpl.java:105)
    at tn.com.st2i.webscript.RetrieveGeneratedDocumentPost.execute(RetrieveGeneratedDocumentPost.java:79)
    at org.alfresco.repo.web.scripts.RepositoryContainer$3.execute(RepositoryContainer.java:429)
    at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:452)
    at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:491)
    at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:529)
    at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:341)
    at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:378)
    at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:209)
    at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:132)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:61)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:215)
    at java.util.zip.ZipFile.<init>(ZipFile.java:145)
    at java.util.zip.ZipFile.<init>(ZipFile.java:159)
    at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipFile(ZipHelper.java:157)
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:129)
    ... 32 more

很明显,文件存在

【问题讨论】:

  • 请提供代码的相关部分和堆栈跟踪。
  • 我编辑了帖子并提供了代码和堆栈跟踪
  • XWPF 适用于 new docx 格式,它是一个包含 Microsoft OpenDocument 格式的 xml 文件的 zip 文件。您有一个似乎是旧 Word 格式(Word 97-2007)的 XML 文件,因此您需要使用 HWPF。所有这些都在 POI Word API here 的介绍页面上进行了描述。请在询问 SO 之前阅读文档。
  • @l4mpi 给出的 xml 是正确的格式(docx 格式),正如 here 提到的,我在发布之前已经阅读了文档,但我没有找到解决我的问题的方法
  • @alaeddine.nasri 好吧,也许您的 XML 符合 docx 规范,但 XML 文件仍然不是有效的 docx 文件,因为 docx 文件是包含多个文件夹和文件的 zip。直接从您的链接中引用,“Word 2007 中的文件格式包含一个压缩的 ZIP 文件,称为包”。只需使用存档阅读器打开任何 docx 文件(您可能需要将其重命名为 .zip 才能正常工作)以亲自查看。

标签: java xml apache-poi openxml


【解决方案1】:

你所拥有的是 Flat OPC XML。

我不知道 POI 是否可以处理,但是 docx4j(我正在研究)可以。

查看示例代码ConvertInFlatOpenPackage.java

顺便说一句,Word 文档本身也有多种处理“变量”的选项(即与平面 OPC 表示形式相反);最好的恕我直言,内容控制数据绑定。

【讨论】:

    【解决方案2】:

    从堆栈跟踪中可以清楚地看出,您提供的是一个纯 XML 文件。正版 Word 2007 文档由 XML 和 ZIP 存档中的其他文件组成。

    【讨论】:

    • 我在word中选择“另存为xml”选项时使用生成的xml文件。事实上,我想用 Freemarker 添加一些变量,然后再次生成 *.docx
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多