Excel中讀取圖片的坑-poi-2007

現(xiàn)象:

  • 在web頁面導入excel文件,excel中包含圖片,在后臺進行解析的時候,有時候會報NullPointerException根盒。

問題排查:

  • 由于POI里面并沒有把這里的錯誤信息輸出到日志文件,在服務器上報錯后物蝙,從后臺日志文件中根本看不出什么炎滞。
    在本地調(diào)試的時候,又沒有報錯诬乞,搞得我們一直以為是臨時文件的沒有正常讀取導致的册赛,而且我們把tomcat的temp目錄刪除后重啟,竟然神奇又不報錯了震嫉。
    哪知道昨天客戶現(xiàn)場又報這個錯森瘪,但是我剛剛刪除了temp目錄,重啟了tomcat捌倍隆6蟛恰!悴势!受不了窗宇,我死活都要找到原因,說干就干特纤,把線上的temp目錄覆蓋我本地的temp目錄军俊,
    本地環(huán)境啟起來,拿那個現(xiàn)場出錯的excel一試捧存,錯誤沒有辜負我的期望粪躬,如期而遇,控制臺錯誤日志如下(吐槽POI昔穴,這個錯誤日志竟然只輸出控制臺):
java.lang.NullPointerException
    at org.apache.poi.ss.util.ImageUtils.getResolution(ImageUtils.java:117)
    at org.apache.poi.ss.util.ImageUtils.getImageDimension(ImageUtils.java:79)
    at org.apache.poi.ss.util.ImageUtils.setPreferredSize(ImageUtils.java:141)
    at org.apache.poi.xssf.usermodel.XSSFPicture.getPreferredSize(XSSFPicture.java:221)
    at org.apache.poi.xssf.usermodel.XSSFPicture.getPreferredSize(XSSFPicture.java:210)
    at org.apache.poi.xssf.usermodel.XSSFPicture.getPreferredSize(XSSFPicture.java:200)
    at com.hentre.all580.core.util.excel.ExcelUtilXlsx.getPicValue(ExcelUtilXlsx.java:51)
    at com.hentre.all580.core.util.excel.ExcelUtil.getCellValue(ExcelUtil.java:118)
    at com.hentre.all580.core.util.excel.ExcelHandler.getValue(ExcelHandler.java:155)
    at com.hentre.all580.core.util.excel.JourneyExcelHandler.templateResolve(JourneyExcelHandler.java:64)
    at com.hentre.all580.core.util.excel.JourneyExcelHandler.templateResolve(JourneyExcelHandler.java:115)
    at com.hentre.all580.coreplatform.controller.upload.ImportItineraryHandler.doExecute(ImportItineraryHandler.java:41)
    at com.hentre.all580.coreplatform.controller.upload.AbstractImportHandler.execute(AbstractImportHandler.java:41)
    at com.hentre.all580.coreplatform.controller.upload.BaseUploadController.upload(BaseUploadController.java:184)
    ...
  • 找到報錯地方的代碼如下:
public static int[] getResolution(ImageReader r) throws IOException {
        int hdpi = 96;
        int vdpi = 96;
        double mm2inch = 25.4D;
        Element node = (Element)r.getImageMetadata(0).getAsTree("javax_imageio_1.0"); //這一行拋錯
        NodeList lst = node.getElementsByTagName("HorizontalPixelSize");
        if(lst != null && lst.getLength() == 1) {
            hdpi = (int)(mm2inch / (double)Float.parseFloat(((Element)lst.item(0)).getAttribute("value")));
        }

        lst = node.getElementsByTagName("VerticalPixelSize");
        if(lst != null && lst.getLength() == 1) {
            vdpi = (int)(mm2inch / (double)Float.parseFloat(((Element)lst.item(0)).getAttribute("value")));
        }

        return new int[]{hdpi, vdpi};
    }
  • 從上面的現(xiàn)象看镰官,一直以為是臨時文件的讀取問題,反復調(diào)試臨時文件的創(chuàng)建和讀取吗货,此處略過10000字泳唠,poi里面解析圖片的代碼復雜。卿操。警检。。害淤。
  • 偶然在調(diào)試在上面拋錯那里的代碼時扇雕,發(fā)現(xiàn)r的類型竟然是不一樣的,正常的情況下是JPEGImageReader窥摄,報錯的情況竟然是CMYKJPEGImageReader镶奉。
    找到CMYKJPEGImageReader的getImageMetadata()方法,代碼如下:
public IIOMetadata getImageMetadata(int imageIndex) throws IOException {
        return null;
    }
  • 瞬間明白了,但是這坑爹的poi怎么會把圖片解析成這個類型呢哨苛?為什么同一圖片鸽凶,有時候是,有時候又不是呢建峭?百度了一下玻侥,大概說明如下:

CMYK也稱作印刷色彩模式,顧名思義就是用來印刷的亿蒸。
它和RGB相比有一個很大的不同:RGB模式是一種發(fā)光的色彩模式凑兰,你在一間黑暗的房間內(nèi)仍然可以看見屏幕上的內(nèi)容;
CMYK是一種依靠反光的色彩模式边锁,我們是怎樣閱讀報紙的內(nèi)容呢姑食?是由陽光或燈光照射到報紙上,再反射到我們的眼中茅坛,才看到內(nèi)容音半。它需要有外界光源,如果你在黑暗房間內(nèi)是無法閱讀報紙的贡蓖。
只要在屏幕上顯示的圖像曹鸠,就是RGB模式表現(xiàn)的。只要是在印刷品上看到的圖像摩梧,就是CMYK模式表現(xiàn)的物延。比如期刊、雜志仅父、報紙、宣傳畫等浑吟,都是印刷出來的笙纤,那么就是CMYK模式的了。

總結(jié):

  • 發(fā)現(xiàn)如果用POI從excel中獲取圖片的話组力,那么上面的問題是無解的省容。咱惹不起,只能躲了燎字,果斷在導入模板里面把圖片刪除了腥椒,然后把這個原則深深的記在了腦海里!
    我真的是太機智了候衍。笼蛛。。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛉鹿,一起剝皮案震驚了整個濱河市滨砍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖惋戏,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件领追,死亡現(xiàn)場離奇詭異,居然都是意外死亡响逢,警方通過查閱死者的電腦和手機绒窑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舔亭,“玉大人些膨,你說我怎么就攤上這事》中” “怎么了傀蓉?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長职抡。 經(jīng)常有香客問我葬燎,道長,這世上最難降的妖魔是什么缚甩? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任谱净,我火速辦了婚禮,結(jié)果婚禮上擅威,老公的妹妹穿的比我還像新娘壕探。我一直安慰自己,他們只是感情好郊丛,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布李请。 她就那樣靜靜地躺著,像睡著了一般厉熟。 火紅的嫁衣襯著肌膚如雪导盅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天揍瑟,我揣著相機與錄音白翻,去河邊找鬼。 笑死绢片,一個胖子當著我的面吹牛滤馍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播底循,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼巢株,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了此叠?” 一聲冷哼從身側(cè)響起纯续,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤随珠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猬错,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窗看,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年倦炒,在試婚紗的時候發(fā)現(xiàn)自己被綠了显沈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡逢唤,死狀恐怖拉讯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳖藕,我是刑警寧澤魔慷,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站著恩,受9級特大地震影響院尔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喉誊,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一邀摆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伍茄,春花似錦栋盹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至曹仗,卻和暖如春躏敢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背整葡。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讥脐,地道東北人遭居。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像旬渠,于是被迫代替她去往敵國和親俱萍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容