TomcatでApache POI 3.16を使用してExcelファイルを作成するにはどうすればよいですか?Apache POIはTomcatではクラッシュしますが、IDEではクラッシュしません
私はapache POI 3.16を使用してXLSX(XSSFWorkbookクラスを使用)を作成し、それを単にOutputStreamに書き込むWebアプリケーションを作成しています。ユーザーがボタンをクリックさせてから、サーバーの応答にExcelファイルを直接書き込んで、ユーザーが即座にダウンロードできるようにすることです。
これは(日食と桟橋を使用して)私の開発環境で完璧に動作しますが、私はMavenを使用して、展開.warファイルを作成し、私のバニラTomcat上でそれを展開するときに、私は説明できないエラーを取得:
- XLSXファイルは1枚しか問題なく動作します。
- シート以上のファイルがエラーを送信します。
また、この問題の解決を試みるために、ドキュメント(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でのみ破損し、突入先ではないのですか?
Apache POIの動作にSaxonは必須ではありません。 Apache POIはあなたのJVMに標準規格に準拠したXMLパーサを必要としています – Gagravarr
tomcastサーバで使用されているJVMには、標準に準拠したXMLパーサがありません。もしそうなら、それはサクソンを見つけられないことについて特に不平を言うのはなぜですか? –