/** * 获取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
/** * Create and initialize a CTTwoCellAnchor that anchors a shape against * top-left and bottom-right cells. * * @return a new CTTwoCellAnchor */ private CTTwoCellAnchor createTwoCellAnchor(XSSFClientAnchor anchor) { CTTwoCellAnchor ctAnchor = drawing.addNewTwoCellAnchor(); ctAnchor.setFrom(anchor.getFrom()); ctAnchor.setTo(anchor.getTo()); ctAnchor.addNewClientData(); anchor.setTo(ctAnchor.getTo()); anchor.setFrom(ctAnchor.getFrom()); STEditAs.Enum editAs; switch (anchor.getAnchorType()) { case DONT_MOVE_AND_RESIZE: editAs = STEditAs.ABSOLUTE; break; case MOVE_AND_RESIZE: editAs = STEditAs.TWO_CELL; break; case MOVE_DONT_RESIZE: editAs = STEditAs.ONE_CELL; break; default: editAs = STEditAs.ONE_CELL; } ctAnchor.setEditAs(editAs); return ctAnchor; }
@Override public boolean equals(Object o) { if (o == null || !(o instanceof XSSFClientAnchor)) return false; XSSFClientAnchor anchor = (XSSFClientAnchor) o; return cell1.toString().equals(anchor.getFrom().toString()) && cell2.toString().equals(anchor.getTo().toString()) ; }
/** * 获取指定工作表里指定行指定列上的图片数据,只能处理xlsx文档。 * 此方法提升了获取图片的性能 * @param pictureList Picture列表 * @param rowNo 指定行 * @param colNo 指定列 * @return POI中的PictureData对象 */ public PictureData getXlsxPictureData(List<Picture> pictureList, int rowNo, int colNo) { for (Picture picture : pictureList) { XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getPreferredSize(); CTMarker marker = anchor.getFrom(); if (marker.getRow() == rowNo && marker.getCol() == colNo) { return picture.getPictureData(); } } return null; }
/** * 获取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; }
/** * 获取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) { 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; }
/** * 获取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
/** * Create and initialize a CTTwoCellAnchor that anchors a shape against top-left and bottom-right cells. * * @return a new CTTwoCellAnchor */ private CTTwoCellAnchor createTwoCellAnchor(XSSFClientAnchor anchor) { CTTwoCellAnchor ctAnchor = drawing.addNewTwoCellAnchor(); ctAnchor.setFrom(anchor.getFrom()); ctAnchor.setTo(anchor.getTo()); ctAnchor.addNewClientData(); anchor.setTo(ctAnchor.getTo()); anchor.setFrom(ctAnchor.getFrom()); STEditAs.Enum aditAs; switch(anchor.getAnchorType()) { case ClientAnchor.DONT_MOVE_AND_RESIZE: aditAs = STEditAs.ABSOLUTE; break; case ClientAnchor.MOVE_AND_RESIZE: aditAs = STEditAs.TWO_CELL; break; case ClientAnchor.MOVE_DONT_RESIZE: aditAs = STEditAs.ONE_CELL; break; default: aditAs = STEditAs.ONE_CELL; } ctAnchor.setEditAs(aditAs); return ctAnchor; }
/** * Create and initialize a CTTwoCellAnchor that anchors a shape against * top-left and bottom-right cells. * * @return a new CTTwoCellAnchor */ private CTTwoCellAnchor createTwoCellAnchor(XSSFClientAnchor anchor) { CTTwoCellAnchor ctAnchor = drawing.addNewTwoCellAnchor(); ctAnchor.setFrom(anchor.getFrom()); ctAnchor.setTo(anchor.getTo()); ctAnchor.addNewClientData(); anchor.setTo(ctAnchor.getTo()); anchor.setFrom(ctAnchor.getFrom()); STEditAs.Enum editAs; switch (anchor.getAnchorType()) { case DONT_MOVE_AND_RESIZE: editAs = STEditAs.ABSOLUTE; break; case MOVE_AND_RESIZE: editAs = STEditAs.TWO_CELL; break; case MOVE_DONT_RESIZE: editAs = STEditAs.ONE_CELL; break; default: editAs = STEditAs.ONE_CELL; } ctAnchor.setEditAs(editAs); return ctAnchor; }