@Override public Iterator<XSSFShape> iterator() { return _drawing.getShapes().iterator(); }
@Override public Iterator<XSSFShape> iterator() { return getShapes().iterator(); }
@Override public Iterator<XSSFShape> iterator() { return getDrawing().getShapes(this).iterator(); }
/** * 获取XLSX工作簿指定sheet中图片列表 * * @param workbook 工作簿{@link Workbook} * @param sheetIndex sheet的索引 * @return 图片映射,键格式:行_列,值:{@link PictureData} */ private static Map<String, PictureData> getPicMapXlsx(XSSFWorkbook workbook, int sheetIndex) { final Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); final XSSFSheet sheet = workbook.getSheetAt(sheetIndex); XSSFDrawing drawing; for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { drawing = (XSSFDrawing) dr; final List<XSSFShape> shapes = drawing.getShapes(); XSSFPicture pic; CTMarker ctMarker; for (XSSFShape shape : shapes) { pic = (XSSFPicture) shape; ctMarker = pic.getPreferredSize().getFrom(); sheetIndexPicMap.put(StrUtil.format("{}_{}", ctMarker.getRow(), ctMarker.getCol()), pic.getPictureData()); } } } return sheetIndexPicMap; } // -------------------------------------------------------------------------------------------------------------- Private method end
/** * 获取XLSX工作簿指定sheet中图片列表 * * @param workbook 工作簿{@link Workbook} * @param sheetIndex sheet的索引 * @return 图片映射,键格式:行_列,值:{@link PictureData} */ private static Map<String, PictureData> getPicMapXlsx(XSSFWorkbook workbook, int sheetIndex) { final Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); final XSSFSheet sheet = workbook.getSheetAt(sheetIndex); XSSFDrawing drawing; for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { drawing = (XSSFDrawing) dr; final List<XSSFShape> shapes = drawing.getShapes(); XSSFPicture pic; CTMarker ctMarker; for (XSSFShape shape : shapes) { pic = (XSSFPicture) shape; ctMarker = pic.getPreferredSize().getFrom(); sheetIndexPicMap.put(StrUtil.format("{}_{}", ctMarker.getRow(), ctMarker.getCol()), pic.getPictureData()); } } } return sheetIndexPicMap; } // -------------------------------------------------------------------------------------------------------------- Private method end
XSSFDrawing drawing = sheet.getDrawingPatriarch(); if (drawing != null) { for (XSSFShape shape : drawing.getShapes()){ if (shape instanceof XSSFSimpleShape){ String boxText = ((XSSFSimpleShape)shape).getText();
/** * Returns the shapes associated with this sheet, * an empty list or null if there is an exception */ public List<XSSFShape> getShapes() { PackagePart sheetPkg = getSheetPart(); List<XSSFShape> shapes = new LinkedList<>(); // Do we have a comments relationship? (Only ever one if so) try { PackageRelationshipCollection drawingsList = sheetPkg.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation()); for (int i = 0; i < drawingsList.size(); i++) { PackageRelationship drawings = drawingsList.getRelationship(i); PackagePartName drawingsName = PackagingURIHelper.createPartName(drawings.getTargetURI()); PackagePart drawingsPart = sheetPkg.getPackage().getPart(drawingsName); if (drawingsPart == null) { //parts can go missing; Excel ignores them silently -- TIKA-2134 LOGGER.log(POILogger.WARN, "Missing drawing: " + drawingsName + ". Skipping it."); continue; } XSSFDrawing drawing = new XSSFDrawing(drawingsPart); shapes.addAll(drawing.getShapes()); } } catch (XmlException|InvalidFormatException|IOException e) { LOGGER.log(POILogger.WARN, e); return null; } return shapes; }
XSSFDrawing draw = sheet.createDrawingPatriarch(); List<XSSFShape> shapes = draw.getShapes(); Iterator<XSSFShape> it = shapes.iterator(); while(it.hasNext()) { XSSFShape shape = it.next(); if (shape instanceof XSSFTextbox){ XSSFTextbox textbox = (XSSFTextbox) shape; textbox.setText("foo"); // Could take an XSSFRichTextString instead } }
@Override public Iterator<XSSFShape> iterator() { return _drawing.getShapes().iterator(); }
@Override public Iterator<XSSFShape> iterator() { return getShapes().iterator(); }
@Override public Iterator<XSSFShape> iterator() { return getDrawing().getShapes(this).iterator(); }
/** * 获取指定工作表里的所有图片数据,只能处理xlsx文档 * @param sheet 工作表 * @return 工作表里所有图片Picture对象组成的列表 */ public List<Picture> getXlsxPictures(Sheet sheet) { XSSFSheet xssfSheet = (XSSFSheet) sheet; List<POIXMLDocumentPart> documentPartList = xssfSheet.getRelations(); List<Picture> pictureList = new ArrayList<>(); for (POIXMLDocumentPart documentPart : documentPartList) { if (documentPart instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) documentPart; List<XSSFShape> shapeList = drawing.getShapes(); for (XSSFShape shape : shapeList) { if (shape instanceof XSSFPicture) { Picture picture = (XSSFPicture) shape; pictureList.add(picture); } } } } return pictureList; }
public static void main(String[] args) { try { InputStream inp = new FileInputStream("workbook.xlsx"); Workbook wb = WorkbookFactory.create(inp); XSSFSheet sheet1 = (XSSFSheet)wb.getSheetAt(0); //returns the existing SpreadsheetDrawingML from the sheet, or creates a new one XSSFDrawing drawing = sheet1.createDrawingPatriarch(); //loop through all of the shapes in the drawing area for(XSSFShape shape : drawing.getShapes()){ if(shape instanceof Picture){ //convert the shape into a picture XSSFPicture picture = (XSSFPicture)shape; //your logic here } } } catch (Exception e) { e.printStackTrace(); } }
XSSFDrawing dp = wb.getSheetAt(0).createDrawingPatriarch(); List<XSSFShape> pics = dp.getShapes(); XSSFPicture inpPic = (XSSFPicture)pics.get(0); XSSFClientAnchor clientAnchor = inpPic.getClientAnchor(); System.out.println("col1: " + clientAnchor.getCol1() + ", col2: " + clientAnchor.getCol2() + ", row1: " + clientAnchor.getRow1() + ", row2: " + clientAnchor.getRow2()); System.out.println("x1: " + clientAnchor.getDx1() + ", x2: " + clientAnchor.getDx2() + ", y1: " + clientAnchor.getDy1() + ", y2: " + clientAnchor.getDy2());
/** * 获取Excel2007图片 * * @param sheet * 当前sheet对象 * @param workbook * 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } return sheetIndexPicMap; }
XSSFSheet sheet = workBook.getSheetAt(0); XSSFDrawing drawing = sheet.createDrawingPatriarch(); // I know it is ugly, actually you get the actual instance here for (XSSFShape shape : drawing.getShapes()) { if (shape instanceof XSSFPicture) { XSSFPicture picture = (XSSFPicture) shape; XSSFPictureData xssfPictureData = picture.getPictureData(); ClientAnchor anchor = picture.getPreferredSize(); int row1 = anchor.getRow1(); int row2 = anchor.getRow2(); int col1 = anchor.getCol1(); int col2 = anchor.getCol2(); System.out.println("Row1: " + row1 + " Row2: " + row2); System.out.println("Column1: " + col1 + " Column2: " + col2); // Saving the file String ext = xssfPictureData.suggestFileExtension(); byte[] data = xssfPictureData.getData(); String filePath = "C:\\..\\Images\\" + xssfPictureData.getPackagePart().getPartName(); try (FileOutputStream os = new FileOutputStream(filePath)) { os.write(data); os.flush(); } } }
/** * 获取Excel2007图片 * * @param sheet * 当前sheet对象 * @param workbook * 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { if (shape instanceof XSSFPicture) { XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } } return sheetIndexPicMap; }
/** * 获取Excel2007图片 * * @param sheet * 当前sheet对象 * @param workbook * 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } return sheetIndexPicMap; }
/** * 获取Excel2007图片 * * @param sheet * 当前sheet对象 * @param workbook * 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } return sheetIndexPicMap; }
/** * Returns the shapes associated with this sheet, * an empty list or null if there is an exception */ public List<XSSFShape> getShapes() { PackagePart sheetPkg = getSheetPart(); List<XSSFShape> shapes = new LinkedList<>(); // Do we have a comments relationship? (Only ever one if so) try { PackageRelationshipCollection drawingsList = sheetPkg.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation()); for (int i = 0; i < drawingsList.size(); i++) { PackageRelationship drawings = drawingsList.getRelationship(i); PackagePartName drawingsName = PackagingURIHelper.createPartName(drawings.getTargetURI()); PackagePart drawingsPart = sheetPkg.getPackage().getPart(drawingsName); if (drawingsPart == null) { //parts can go missing; Excel ignores them silently -- TIKA-2134 LOGGER.log(POILogger.WARN, "Missing drawing: " + drawingsName + ". Skipping it."); continue; } XSSFDrawing drawing = new XSSFDrawing(drawingsPart); shapes.addAll(drawing.getShapes()); } } catch (XmlException|InvalidFormatException|IOException e) { LOGGER.log(POILogger.WARN, e); return null; } return shapes; }