壹開始對比其他web項目,沒有找到解決方案。最後,找到引發該異常的源代碼:
org . Apache . poi . ss . user model . workbook factory . create(workbook factory . Java:75)
可見調用WorkbookFactory時。Create (InputStream)創建工作簿,將根據文件類型(文件頭)區分並創建適當的工作簿對象。如果hasPOIFSHeader()方法中的前兩個If條件不滿足,就會拋出壹個異常。兩個if中的hasPOIFSHeader()方法是針對Excel2003和Excel2007的判斷,讀取文件流中的文件頭(byte[8])信息進行判斷。
那麽,既然是通過比較文件的表頭信息來判斷的,而且excel只有2003和2007兩個版本,那麽為什麽在讀取放置在classpath下的excel模板並創建為工作簿時,文件的表頭判斷不匹配呢?
最後找到了原因:maven在編譯打包的時候轉碼了resources下的資源文件。最終web項目打印出來的jar/war包,裏面歸檔的excel模板文件都是亂碼,文件頭信息被修改,導致poi根本無法識別這樣的excel文件。
將maven資源插件添加到項目的pom.xml中。
1.建議使用工作簿工廠。在poi-ooxml中創建(InputStream)來創建工作簿,因為HSSFWorkbook和XSSFWorkbook都實現了工作簿接口。(此處通過文件頭改編Excel2003和Excel2007。)
2.在妳的項目中,需要放壹些靜態的資源文件作為模板,比如excel填表模板、word模板(裏面有壹些固定的樣式,程序運行時報表類是通過模板導出的)。這時候最好配置maven去掉資源文件不轉碼。下面有兩種鏈接方式。
Maven打包和過濾資源文件
/Qing _ mei _ xiu/文章/詳情/80661216