2015-03-30 5 views
-4

У меня есть слово сгенерированный XML-файл (2007) с правильной структуройПреобразование XML в документ Word

<?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 Пои, я хочу, чтобы генерировать соответствующий 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 

Очевидно, что файл существует

+2

Просьба указать соответствующие части вашего кода и стек. –

+0

Я отредактировал сообщение и предоставил код и stacktrace –

+1

XWPF предназначен для формата _new_ docx, который представляет собой zip-файл, содержащий xml-файлы в формате Microsoft OpenDocument. У вас есть XML-файл в формате старого Word (Word 97-2007), поэтому вам нужно использовать HWPF. Все это описано на странице внедрения API POI Word [здесь] (https://poi.apache.org/document/index.html). Пожалуйста, прочитайте документы перед тем, как спросить о SO. – l4mpi

ответ

0

Из stacktrace довольно ясно, что вы поставляете голый файл XML. Подлинный документ Word 2007 состоит из XML и других файлов в ZIP-архиве.

+0

Я использую сгенерированный файл xml при выборе опции «Сохранить как xml» в слове. На самом деле я хочу добавить некоторые переменные с помощью Freemarker, а затем снова создать * .docx –

0

У вас есть Flat OPC XML.

Я не знаю, может ли POI обрабатывать это, но docx4j (который я работаю), может.

Смотрите пример кода ConvertInFlatOpenPackage.java

Кстати, существуют также различные варианты обработки «переменных» в самом документе Word (то есть, в отличие от в представлении Flat OPC); лучший IMHO - привязка данных управления контентом.

Смежные вопросы