2017-05-04 4 views
0

TomcatでApache POI 3.16を使用してExcelファイルを作成するにはどうすればよいですか?Apache POIはTomcatではクラッシュしますが、IDEではクラッシュしません

私はapache POI 3.16を使用してXLSX(XSSFWorkbookクラスを使用)を作成し、それを単にOutputStreamに書き込むWebアプリケーションを作成しています。ユーザーがボタンをクリックさせてから、サーバーの応答にExcelファイルを直接書き込んで、ユーザーが即座にダウンロードできるようにすることです。

これは(日食と桟橋を使用して)私の開発環境で完璧に動作しますが、私はMavenを使用して、展開.warファイルを作成し、私のバニラTomcat上でそれを展開するときに、私は説明できないエラーを取得:

  1. XLSXファイルは1枚しか問題なく動作します。
  2. シート以上のファイルがエラーを送信します。

また、この問題の解決を試みるために、ドキュメント(https://poi.apache.org/spreadsheet/quick-guide.html#NewWorkbook)の非常に基本的な例を使用して、次の例を書きました。

[...] 
//this method is called from the onSubmit of a button being pressed 
public void test(){ 
    //test writing a text file 
    final List<String> lines = Arrays.asList("Line one", "Line two"); 
    final Path filepath = Paths.get("C:/path/to/my/file.txt"); 
    try { 
     Files.write(filepath, lines, Charset.forName("UTF-8"), StandardOpenOption.CREATE); 
    } catch (final Exception e) { 
     InvoiceReportPage.logger.error(e.getMessage(), e); 
    } 
    //test writing an excel file 
    final Workbook wb1 = new XSSFWorkbook(); 
    wb1.createSheet("new sheet"); 
    try { 
     final FileOutputStream fileOut1 = new FileOutputStream("C:/path/to/my/workbook.xlsx"); 
     wb1.write(fileOut1); //OpenXML4JException in tomcat 
     fileOut1.close(); 
    } catch (final Exception e) { 
     InvoiceReportPage.logger.error(e.getMessage(), e); 
    } 
    finally { 
     try { 
      wb1.close(); //OpenXML4JException in tomcat 
     } catch(final Exception e) { 
      InvoiceReportPage.logger.error(e.getMessage(), e); 
     } 

    } 
} 
[...] 

私の開発桟橋サーバで完全に罰金この作品が、今回は、関係なく、枚数、私は以前と同じエラーを取得し、私は彼らの内面の一部を欠いているXLSXファイルで終わります構造(これは7zipでそれらを開くことによって見ることができます)、したがって破損して無駄です。

"C:/ path/to/my"というディレクトリのファイルを読み書きできることを確認しましたが、これはテキストファイル "C:/ path/to/my/file.txt "がそのフォルダに正しく書き込まれます。ここで

は、Apache POI 3.16は、Tomcatの中でExcelファイルを作成するために失敗したときに私が取得エラーのスタックトレースです:

org.apache.poi.openxml4j.exceptions.OpenXML4JException: The part /docProps/core.xml fail to be saved in the stream with marshaller org.apache.poi.op[email protected]2a70f1c7 
    at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:582) 
    at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1557) 
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:248) 
    at com.itp.tomasot.webapp.wicket.InvoiceReportPage$InvoiceReportExcelSubmitLink.onSubmit(InvoiceReportPage.java:115) 
    at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1380) 
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:811) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:183) 
    at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91) 
    at com.itp.tomasot.webapp.wicket.WorkflowWebRequestCycleProcessor.processEvents(WorkflowWebRequestCycleProcessor.java:70) 
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1239) 
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1316) 
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1418) 
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:532) 
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356) 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:201) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:394) 
    at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235) 
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:406) 
    at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:185) 
    at org.springframework.security.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:99) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2440) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2429) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

私は準拠レベル1.6でJava 1.7を使用しています。

tomcatサーバーはWindowsサーバー2008 R2サーバーにあり、Webサイトで使用される技術はwicket 1.3.6です。 (私はそれが古代だと知っていますが、私は今はそれについて何もできません)。

ローカルWindowsのEntrepriseマシン上のローカルのTomcatでこの問題をテストしたところ、問題はテストサーバーとまったく同じです。

私のWebアプリケーションは、以下のmaven依存関係を使用して.warファイルにバンドルされています

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.16</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.16</version> 
</dependency> 

編集:Tomcatの中にWebアプリケーションを実行する場合 、私はTomcatのコンソールに表示されるエラーに気づいた(と)他のログファイルにありません:Apache POI error when not in IDE

Error 
    DOMSource cannot be processed: check that saxon8-dom.jar is on the classpath 

これはStackOverflowの上でこの問題に私を導きます

しかし、私はLibreOfficeをTomcatを実行しているマシンにインストールしていません。とにかく、その問題の解決方法は不明です。何が原因で依存関係がTomcatでのみ破損し、突入先ではないのですか?

答えて

0

だから、最後に、これは私が問題を解決する方法である:Tomcatがサクソンlibrairyが欠けていた訴え以来、私は単に私のMavenプロジェクトののpom.xmlで依存関係としてこれを追加しました:

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>saxon-dom</artifactId> 
    <version>8.7</version> 
</dependency> 

この依存関係を含めて展開したら、POIはtomcatで正しく動作するようになりました。不明なまま何

1である)なぜ桟橋のdepenciesは、Tomcatのとは異なります。私のCLASS_PATHや明白な環境変数にはありません。だから私の推測は、実際に私の開発環境に暗黙の依存としてどこかにあるのですが、私はどこにはありませんが、Tomcatではなく、自己完結型であることが分かります。

2)公式文書でsaxonがPOIのPOI依存性として全く言及されていないのはなぜですか?

+0

Apache POIの動作にSaxonは必須ではありません。 Apache POIはあなたのJVMに標準規格に準拠したXMLパーサを必要としています – Gagravarr

+0

tomcastサーバで使用されているJVMには、標準に準拠したXMLパーサがありません。もしそうなら、それはサクソンを見つけられないことについて特に不平を言うのはなぜですか? –

関連する問題