2016-06-22 36 views
7

Ich muss Tabellenzellen als Bilder extrahieren. Die Zellen können gemischten Inhalt (Text + Bild) enthalten, den ich in ein einzelnes Bild zusammenführen muss. Ich bin in der Lage, den Kerntext zu bekommen, aber ich habe keine Ahnung, ein Bild + Text zu bekommen. Ich bin mir nicht sicher, ob der APO-POI helfen würde.Word-Tabellenzelle als Bild extrahieren?

Hat jemand so etwas früher gemacht?

public static void readTablesDataInDocx(XWPFDocument doc) { 
    int tableIdx = 1; 
    int rowIdx = 1; 
    int colIdx = 1; 
    List table = doc.getTables(); 
    System.out.println("==========No Of Tables in Document=============================================" + table.size()); 
    for (int k = 0; k < table.size(); k++) { 
     XWPFTable xwpfTable = (XWPFTable) table.get(k); 
     System.out.println("================table -" + tableIdx + "===Data=="); 
     rowIdx = 1; 
     List row = xwpfTable.getRows(); 
     for (int j = 0; j < row.size(); j++) { 
      XWPFTableRow xwpfTableRow = (XWPFTableRow) row.get(j); 
      System.out.println("Row -" + rowIdx); 
      colIdx = 1; 
      List cell = xwpfTableRow.getTableCells(); 
      for (int i = 0; i < cell.size(); i++) { 
       XWPFTableCell xwpfTableCell = (XWPFTableCell) cell.get(i); 
       if (xwpfTableCell != null) { 
        System.out.print("\t" + colIdx + "- column value: " + xwpfTableCell.getText()); 
       } 
       colIdx++; 
      } 
      System.out.println(""); 
      rowIdx++; 
     } 
     tableIdx++; 
     System.out.println(""); 
    } 
} 

Jetzt bin ich in der Lage Text mit Hilfe dieser Methode zu erhalten

System.out.print("\t" + colIdx + "- column value: " + xwpfTableCell.getText()); 

Wie kann ich das Bild, wenn eine Zelle ein enthält auch?

+1

Versuchen sie die Absätze in der Zelle 'getParagraphs bekommen()', dann fo r jeden Absatz, erhalten Sie die Läufe 'getRuns()'. Dies liefert einen [XWPFRun] (https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFRun.html). Dies hat eine Methode, mit der Sie Bilder erhalten können: 'getEmbeddedPictures()' – iggymoran

+0

@iggymoran Liste para = xwpfTableCell.getParagraphs(); if (para! = Null) { XWPFRun xWPFRun = (XWPFRun) para.get (i); für (int l = 0; l

+1

Sie möchten etwas wie versuchen: 'para.getRuns()', überprüfen Sie, dass sie nicht null sind, und rufen Sie dann 'run.getEmbeddedPictures()'. – iggymoran

Antwort

5

diesen Code versuchen, es für mich funktioniert

XWPFDocument doc = new XWPFDocument(new FileInputStream(fileName)); 
      List<XWPFTable> table = doc.getTables(); 
      for (XWPFTable xwpfTable : table) { 
       List<XWPFTableRow> row = xwpfTable.getRows(); 
       for (XWPFTableRow xwpfTableRow : row) { 
        List<XWPFTableCell> cell = xwpfTableRow.getTableCells(); 
        for (XWPFTableCell xwpfTableCell : cell) { 
         if (xwpfTableCell != null) { 
          System.out.println(xwpfTableCell.getText()); 
          String s = xwpfTableCell.getText(); 
          for (XWPFParagraph p : xwpfTableCell.getParagraphs()) { 
           for (XWPFRun run : p.getRuns()) { 
            for (XWPFPicture pic : run.getEmbeddedPictures()) { 
             byte[] pictureData = pic.getPictureData().getData(); 
             System.out.println("picture : " + pictureData); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
+0

es funktioniert gut ...! –

3

Wenn Sie eine Cell haben, können Sie die paragraphs, die diese Zelle bilden. Diese Absätze werden wiederum von Run s gebildet, die Sie durch Aufruf der getRuns Methode erhalten können. Runs selbst können eingebettete Bilder enthalten, die Sie mit der Methode getEmbeddedPictures abrufen können.

Sie können daher eine Methode, die die eingebetteten Bilder einer Zelle bekommt:

public static void printDescriptionOfImagesInCell(XWPFTableCell cell) { 
    List<XWPFParagraph> paragrahs = cell.getParagraphs(); 
    for (XWPFParagraph paragraph : paragraphs) { 
     List<XWPFRun> runs = paragraph.getRuns(); 
     for (XWPFRun run : runs) { 
      List<XWPFPicture> pictures = run.getEmbeddedPictures(); 
      for (XWPFPicture picture : pictures) { 
       //Do anything you want with the picture: 
       System.out.println("Picture: " + picture.getDescription()); 
      } 
     } 
    } 
} 
tatsächlich

Sie sollten in der Lage sein, mehr Dinge zu entdecken, über die aktuellen Bilder mit der Picture Dokumentation, und ändern Sie die Methode zu erhalten die Bilddaten, Name usw.