使用jexcel導入excel sheet時拋出空指針異常的解決辦法

    我做的項目中不同的成員寫了一堆調查文檔,sheet格式一致,我想把所有人的某一個sheet全部導入到一個excel中去分析,顯然手工copy不僅效率低,容易出錯,文檔隨時都有可能變化,所以手工複製不是一個好辦法,於是就想到用jexcel去自動導入,讀了一下相關的文檔---文檔寫得夠爛的,好不容易找到了一個方法叫importSheet(Workbook中的)可以實現sheet從一個工作簿導入到另一個,但一運行拋出一個大空指針異常:

    於是打開SheetCopier這個類的第996行,分析了一遍,原來是個小bug,開發者應該使用&&來判斷c.getCellFeatures()和c.getCellFeatures().hasDataValidation(),結果他卻使用了短路與,當前者爲null的時候仍然跑去判斷第二個條件了.

 

於是改成&&,再運行build目錄下的ant文件去重新build,又拋出了一堆編碼的異常來.

F:/My Doc/program/java/lib/jexcelapi/src/jxl/format/PaperSize.java:95: 警告:編碼 GBK 的不可映射字符

  又看了下這個類的源代碼,發現它的註釋中用了很多乘號之類的特殊字符,在gbk中無法正常顯示,在iso8859-1中才能正常顯示,於是在build.xml的javac命令中,指定encoding屬性爲"iso8859-1",再編譯,除了一些警告,編譯正常.再回來運行我的導入類,成功.不過jexcel還是不太完美,生成的excel背景色變了,還生成了一些多餘的單元格.而且jexcel只能操作excel2003以前的,對excel2007無法操作.

BTW:實際上,用什麼庫來導入導出sheet頁來,花了1天的時間來研究,如果單純從無到有地生成一份excel文件來,無論是jexcel,poi都可以完成,但到了導入導出,複製sheet來,則因爲excel格式的問題,兩個庫都有問題,poi更差一些,它根本就沒有複製的方法,只有手工讀取每一行每一個單元格地進行復制,還要判斷使用了什麼style,還要判斷數據類型,工作量非常大,自己實現起來實在恐怖,有一個外國的網友最初自己寫了一個類來幹這事,有點bug,後來不知是經他本人還是別人的共同努力,增加了一些方法和類,就是現在的jxls,它是基於poi的,但仍然有一個bug未改正,就是Util類有個地方的Set應該使用HashSet,他卻用了TreeSet,這個類要求元素必須實現Comparable接口的,但存儲的元素卻沒有實現這個接口,當excel文件中有合併的單元格時,調用了涉及這個Set的contains方法時就出錯了,改起來倒也容易,但把sheet複製到另一個工作簿的時候,卻總是報可惡的"Exception in thread "main" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?"異常,真暈.最後也只剩下jexcel可以用了,但它不能操作excel2007,原因是2007和2003之前的版本格式完全不同,微軟又不可能告訴他具體的格式細節,於是不支持了,想了又想,唯一的辦法是先把2007的文件通過某種方式轉成2003,然後再用jexcel來完成導入操作.2007轉換成2003最簡單的辦法是使用宏,這個網頁有介紹:http://www.cnblogs.com/icedog/archive/2010/12/09/1901663.html, 還可以看我發的一個帖子看看宏如何運行,http://topic.csdn.net/u/20110212/17/6b1b71e8-a85d-4fc1-98de-a64081f30528.html.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章