장면이 나타납니다
아파치 포이
리눅스
수코양이
위에서 볼 수 있듯이 Linux+Tomcat 환경에서 Apache POI를 사용하여 Excel을 내보내는 경우 "그러한 파일 또는 디렉토리 없음"의 오류 가보고됩니다.
오류 메시지
java.lang.runtimeexception : java.io.ioexception : org.apache.poi.xssf.streaming.sxssfworkbook.createandregistersxssfsheet (sxssfwork.java:569)의 파일 또는 디렉토리가 없습니다. org.apache.poi.xssf.streaming.sxssfworkbook.createsheet (com.app.util.excelioutil.write의 sxssfworkbook.java:558) at com.app.controllers.drivingschooltroller.download (drivingschool.javatortroller.download). sun.reflect.nativeMethodaccessorimpl.invoke0 (네이티브 메소드)에서 sun.reflect.nativeMeThodAccessorimpl.invoke (nativeMethodaccessorimpl.java:39)에서 sun.reflect.delegatingmethodaccessorimpl.invoke (at sun.reflect.nativemethodaccessorimpl.invoke) java.lang.reflect.method.invoke (method.java:597) at com.mvc.invoke.actioninvoker.invoke (actioninvoker.java:75)의 com.mvc.mvcdispatcher.service (mvcdispatcher.java:119) at com.mvc.mvcfilter.dofilter (mvcfilter.java:67) 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 (org.apache.catalina.authenticator.authenticatorbase.invoke (authenticatorbase.java:502) at org.apache.catalina.core.standardhostvalve.invoke (표준 호스트 볼베 org.apache.catalina.valves.accesslogvalve.invoke (ac org.apache.catalina.connector.coyoteadapter.service (coyoteadapter.java:408) at org.apache.coyote.http11.abstracthttp11processor.process (albtracthttp11processor.java:1023) org.apache.coyote.abstractprotocol $ actractconnectionhandler.process.process (atbractProtocol.java:589) at org.apache.tomcat.util.net.aprendpoint $ socketwithOptionsprocessor.run (aprendpoint.java:1810) at java.util.concurrent.threadpoolexecutor $ worker.runtask.runtask (java.util.concurrent.threadpoolexecutor $ worker.run (threadpoolecutor.java:908)의 java.lang.thread.run (thread.java:662).
해결책
솔루션에 대해 먼저 이야기 해 봅시다. 솔루션은 매우 간단하기 때문에 Tomcat의 루트 디렉토리에 "Temp"폴더 만 만들면됩니다.
오류의 원인
이 오류의 이유는 POI가 내보내기 엑셀을 기본적으로 시스템의 임시 디렉토리로 내보내기 때문입니다. 당시에는 임시 폴더가 Linux의 Tomcat 아래에 존재하지 않았으므로 디렉토리를 찾을 수 없습니다. 실제로, Tomcat Root 디렉토리에 온도가없는 한 어떤 시스템 환경에 있든 상관 없습니다. 아래 POI의 소스 코드를 보면 이해할 것입니다.
public void write (outputstream stream)는 ioexception {for (sxssfsheet sheet : _xfromsxhash.values ()) {sheet.flushrows (); } // 임시 디렉토리에 저장 파일 tmplfile = file.createtempfile ( "poi-sxssf-template", ".xlsx"); tmplfile.deleteOnexit (); fileoutputStream os = 새 FileOutputStream (tmplfile); _wb.write (OS); os.close (); // 템플릿 항목을 생성 된 시트 데이터 파일로 대체합니다. InjectData (tmplfile, stream); tmplfile.delete (); } 위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.