一:Poi讀取Excle報錯 java.util.zip.ZipException: invalid stored block lengths
系統中需要導出excle簽收單,excle模板是預設好放在classpath下的(idea中resources目錄),程序運行的時候,利用類加載器從classpath讀取文件讀成BufferedInputStream,然后利用 inputStream 實例化XSSFWorkbook對象
代碼如下(web環境運行報錯):
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(EXCEL_TEMPLATE);//此處從classpath下獲取源文件,在web環境中所有的源文件都是被壓縮在war包下的 XSSFWorkbook workbook = new XSSFWorkbook(inputStream ); //此處報錯: java.util.zip.ZipException: invalid stored block lengths
關於poi讀取excle的操作,在單元測試是沒問題的!至於單元測試和正式代碼的區別是單元測試是絕對路徑獲取文件,再將文件轉化為fileinputstream,再用這個input實例化XSSFWorkbook對象。
代碼如下(單元測試環境運行ok):
File fileTemplate = new File("D:/workspace/template.xlsx");//可以看見此處是絕對路徑獲取源文件
// 轉化流
FileInputStream is = new FileInputStream(fileTemplate);
// 創建工作簿
XSSFWorkbook workbook = new XSSFWorkbook(is);
//此代碼運行ok
觀察上述2段代碼可發現,區別在於2 點,1):流的類型不同,2):一個源文件是被壓縮,一個是沒有被壓縮
關於流類型不同這個點 ,實例化 XSSFWorkbook 對象 接收的參數 是 inputstream 這個抽象類的實例 ,而上述2段代碼的流都是繼承inputstream ,根據多態的思想,上述2段代碼的入參都沒問題!
那么問題產生的可能的原因就是 一個源文件是被壓縮,一個是沒有被壓縮 了,畢竟報錯信息是: java.util.zip.ZipException: invalid stored block lengths(無效的存儲塊的長度) 可能和壓縮打war包有關,
於是我將war包解壓,嘗試打開classpath下的excle文件,發現打不開,文件損壞!
於是基本確定是maven install 打包的時候 導致文件壓縮不可用的原因了!
於是maven中增加插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.6</version>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions> <nonFilteredFileExtension>xlsx</nonFilteredFileExtension> //xlsx結尾的文件不 </nonFilteredFileExtensions>
</configuration>
</plugin>
官網原話:To prevent corrupting your binary files when filtering is enabled, you can configure a list of file extensions that will not be filtered.
鏈接:https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html
如此配置在web環境中就沒問題了!
特意記錄,主要是解決問題的思想重要。。。。。。。。。。
