2015-10-09 3 views
0

Я застрял в чтении изображений с листа Excel.Чтение изображений из листа Excel по строкам

У меня есть один лист Excel, который включает информацию о сотруднике, такую ​​как имя, адрес и фотография сотрудника. Я хочу прочитать его с помощью Java и сохранить его в некоторой системе управления пользователями.

Ниже мой код:

int idColumn = ...; 
POIFSFileSystem poifs = ...; 
HSSFWorkbook workbook = new HSSFWorkbook(poifs); 
HSSFSheet sheet = workbook.getSheetAt(0); 

List<HSSFPictureData> pictures = workbook.getAllPictures(); 
for (int i = 0; i < pictures.size(); i++) { 
    HSSFPictureData picture = pictures.get(i); 

    // This does not map to the row from the picture: 
    HSSFRowrow = sheet.getRow(i); 

    HSSFCell idCell = row.getCell(idColumn); 
    long employeeId = idCell != null ? (long) idCell.getNumericCellValue() : 0; 

    myUserService.updatePortrait(employeeId, picture.getData()); 
} 

Проблема заключается в том, что это не отображение в точный пользователь, как на листе Excel: Пусть пользователя имеет изображение на первенствовать лист. Но это не сопоставление с пользователем A. Поэтому я хотел бы знать, как читаются строки изображений.

+2

добровольцев, как правило, помочь тем, кто помогает себе больше, чем те, которые не могут быть обеспокоены, чтобы форматировать свои вопросы разборчиво, и игнорировать соглашения по капитализации и т.д. – pnuts

+0

Было бы здорово, если бы вы просто предоставить соответствующий раздел код и точная проблема? – YoungHobbit

+0

прямо сейчас проблема заключается в том, что он не соответствует точному пользователю, как на листе excel. означает, что пользователь «A» имеет изображение «Изображение A» на листе excel. но его не сопоставление с пользователем «А». поэтому я хочу читать строки изображений. это будет полезно для меня. – SANKET

ответ

2

Как вы могли заметить: ячейка в Excel не делает никогда содержатьPicture (или любой другой Shape). Вместо этого существует отдельный слой, содержащий все объекты Shape для листа. Вот почему вы можете разместить изображение через несколько ячеек.

Но вы могли бы использовать якорь из формы, чтобы определить, к какой ячейке он был прикреплен во время позиционирования:

int idColumn = ...; 
int pictureColumn = ...; 
HSSFSheet sheet = ...; 

for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { 
    if (shape instanceof HSSFPicture) { 
     HSSFPicture picture = (HSSFPicture) shape; 
     HSSFClientAnchor anchor = (HSSFClientAnchor) picture.getAnchor(); 

     // Ensure to use only relevant pictures 
     if (anchor.getCol1() == pictureColumn) { 

      // Use the row from the anchor 
      HSSFRow pictureRow = sheet.getRow(anchor.getRow1()); 
      if (pictureRow != null) { 
       HSSFCell idCell = pictureRow.getCell(idColumn); 
       if (idCell != null) { 
        long employeeId = (long) idCell.getNumericCellValue(); 
        myUserService.updatePortrait(employeeId, picture.getData()); 
       } 
      } 
     } 
    } 
} 

Я использую HSSFPatriarch в моем примере, так как это дает возможность определить фотографии на лист (если в файле имеется более одного листа).

Важно заметить, что якорь формы не должен находиться в ячейке, где изображение визуально расположено, хотя обычно оно и есть. В этом случае вы можете извлечь позицию из атрибутов dx1 и dy1 якоря.

+0

Это работает! Спасибо, что поделились этим! – MDroid

0
POIFSFileSystem poifs = new POIFSFileSystem(fis) ; 
      HSSFWorkbook workbook = new HSSFWorkbook(poifs); 
      HSSFSheet sheet = workbook.getSheetAt(0); 
      int idColumn1 = 14; 
      int idColumn2 = 16; 
      int pictureColumn = 0; 
      //HSSFSheet sheet = null; 

      for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { 
       if (shape instanceof HSSFPicture) { 
        HSSFPicture picture = (HSSFPicture) shape; 
        HSSFClientAnchor anchor = (HSSFClientAnchor) picture.getAnchor(); 

        // Ensure to use only relevant pictures 
        if (anchor.getCol1() == pictureColumn) { 

         // Use the row from the anchor 
         HSSFRow pictureRow = sheet.getRow(anchor.getRow1()); 
         if (pictureRow != null) { 
          HSSFCell idCell14 = pictureRow.getCell(17); 
          HSSFCell idCell16 = pictureRow.getCell(19); 
         System.out.println(idCell14); 
           int age = (int)idCell14.getNumericCellValue(); 
           int year = (int)idCell16.getNumericCellValue(); 

           System.out.println(age+":"+year); 
           HSSFPictureData data = picture.getPictureData(); 
          byte data1[] = data.getData(); 
         FileOutputStream out = new FileOutputStream(age+"."+year+".png"); 
           out.write(data1); 
           out.close(); 
           pcount++; 
         } 
        } 
       } 
Смежные вопросы