2015-09-15 3 views
1

Я пытаюсь прочитать изображение, которое я вставил перед собой на листе excel вместе с его позицией с помощью этого кода, он отлично работает на моей машине, но когда я переношу код на другой компьютер, я получаю исключение нулевого указателя в sheet.getDrawingPatriarch.getChildren(), я пытаюсь решить проблему, но я не нашел решение, кто-нибудь может мне помочь? Ниже приведен код:null указатель from sheet.drawingPatriarch.getChildren()

/* loop the sheet */ 
    for (int i = 0; i < sheetNumbers; i++) { 

     sheet = wb.getSheetAt(i); 
     /* create map to store id map with picture */ 
     Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); 

     /* determine to use 2003's excel get pic method or 2007++ get picture method */ 
     if (fileExt.equals("xls")) { 
      if(((HSSFSheet) sheet).getDrawingEscherAggregate() != null) 
       sheetIndexPicMap = getSheetPictrues03(i, (HSSFSheet) sheet, (HSSFWorkbook) wb); 
     } 
     /* store the picture and id map into a list */ 
     sheetList.add(sheetIndexPicMap); 
    } 

    printImg(sheetList); 

} 


public static Map<String, PictureData> getSheetPictrues03(int sheetNum, 
     HSSFSheet sheet, HSSFWorkbook workbook) { 

    Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); 
    List<HSSFPictureData> pictures = workbook.getAllPictures(); 
    if (pictures.size() != 0) { 

     for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { 
      HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); 
      if (shape instanceof HSSFPicture) { 
       HSSFPicture pic = (HSSFPicture) shape; 
       int pictureIndex = pic.getPictureIndex() - 1; 
       HSSFPictureData picData = pictures.get(pictureIndex); 
       HSSFRow row = sheet.getRow(anchor.getRow1()); 
       HSSFCell cell = row.getCell(0); 
       String picIndex = "ID"+String.valueOf(cell); 

       sheetIndexPicMap.put(picIndex, picData); 
      } 
     } 
     return sheetIndexPicMap; 
    } else { 
     return null; 
    } 
} 


public static void printImg(List<Map<String, PictureData>> sheetList) throws IOException { 

    for (Map<String, PictureData> map : sheetList) { 
     Object key[] = map.keySet().toArray(); 
     for (int i = 0; i < map.size(); i++) { 
      /*get picture data*/ 
      PictureData pic = map.get(key[i]); 
      /*get row id where the picture reside*/ 
      String picName = key[i].toString(); 
      /*get file extension of the pictur*/ 
      String ext = pic.suggestFileExtension(); 

      byte[] data = pic.getData(); 

      FileOutputStream out = new FileOutputStream("pic" + picName + "." + ext); 
      out.write(data); 
      out.close(); 
     } 
    } 

} 
+0

Возможно, что 'sheet' имеет значение null или' sheet.getDrawingPatriarch() 'возвращает null. Введем там нулевую проверку. –

+0

У вас есть одинаковые баночки Apache POI на обеих машинах? И у них нет лишних? – Gagravarr

+0

Я постараюсь проверить это, я думаю, что это может быть причиной, моя машина работает с версией версии 12, а на другой машине работает версия версии 7, может ли это быть причиной? –

ответ

0

Проблема решена, я скопировать весь мой проект вместо Java-файл в новую машину, код работает, я думаю, что вопросы будут некоторые unsynchronzie файла баночка от 2 машины, спасибо @akhil_mittal и @Gagravarr за то, что вы дали мне совет, большое спасибо!

2

Мне кажется, что либо sheet является null или sheet.getDrawingPatriarch() возвращается null. Пожалуйста, напишите код, как:

if (pictures.size() != 0) { 
     if(sheet!=null && sheet.getDrawingPatriarch()!=null && sheet.getDrawingPatriarch().getChildren()!=null) { 
     for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { 
      HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); 
      if (shape instanceof HSSFPicture) { 
       HSSFPicture pic = (HSSFPicture) shape; 
       int pictureIndex = pic.getPictureIndex() - 1; 
       HSSFPictureData picData = pictures.get(pictureIndex); 
       HSSFRow row = sheet.getRow(anchor.getRow1()); 
       HSSFCell cell = row.getCell(0); 
       String picIndex = "ID"+String.valueOf(cell); 

       sheetIndexPicMap.put(picIndex, picData); 
      } 
     } 
     } 
     return sheetIndexPicMap; 
    } else { 
     return null; 
    } 
+0

Благодарим вас за ответ, я добавил нулевую проверку, если вы указали, что не было ошибки, показанной сейчас, но проблема в том, что я не могу прочитать данные изображения, потому что sheet.getDrawingPatriarch(). GetChildren() возвращает null, у вас есть любая идея, почему sheet.getDrawingPatriarch(). getChildren() возвращает null? есть изображение, вставленное в мой лист, и я мог прочитать изображение на моей машине, когда я запускаю этот код на другом компьютере, sheet.getDrawingPatriarch(). getChildren() возвращает null. Заранее спасибо –

+0

@SoonEe: Возможно, вам придется отлаживать, почему вы получаете нуль. –

Смежные вопросы