2016-06-22 14 views
7

Potrzebuję wyodrębnić komórki tabeli jako obrazy. Komórki mogą zawierać mieszaną zawartość (Text + Image), którą muszę scalić w jeden obraz. Potrafię uzyskać podstawowy tekst, ale nie mam pojęcia, jak uzyskać obraz + tekst. Nie jesteś pewien, czy Apace POI mogłoby pomóc.Wyodrębnianie komórki tabeli MS Word jako obrazu?

Czy ktoś zrobił coś takiego wcześniej?

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(""); 
    } 
} 

Teraz jestem w stanie uzyskać tekst przy pomocy tej metody

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

Jak mogę uzyskać obraz jeśli komórka zawiera również jeden?

+1

Spróbuj się akapity w komórce 'getParagraphs()', następnie fo r każdy akapit, pobierz przebiegi 'getRuns()'. Zwraca to [XWPFRun] (https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFRun.html). Jest to metoda, która pozwala na uzyskanie obrazów: 'getEmbeddedPictures()' – iggymoran

+0

@iggymoran List para = xwpfTableCell.getParagraphs(); if (para! = Null) { XWPFRun xWPFRun = (XWPFRun) para.get (i); dla (int l = 0; l

+1

Chcesz wypróbować coś takiego: 'para.getRuns()', sprawdź, czy nie są one zerowe, a następnie wywołaj 'run.getEmbeddedPictures()'. – iggymoran

Odpowiedz

5

Spróbuj tego kodu, to działa na mnie

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

działa poprawnie ...! –

3

Po uzyskaniu Cell można uzyskać paragraphs, które tworzą tę komórkę. Te akapity są z kolei tworzone przez Run s, które można uzyskać, wywołując metodę getRuns. Same programy mogą zawierać osadzone obrazy, które można uzyskać, wywołując metodę getEmbeddedPictures.

Można zatem mieć metodę, która pobiera wbudowanego zdjęcia komórką:

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()); 
      } 
     } 
    } 
} 

powinien być w stanie dowiedzieć się więcej rzeczy o rzeczywistych obrazów z dokumentacją Picture, i zmienić sposób, aby rzeczywiście dostać dane obrazu, nazwa, itp

Powiązane problemy