Excel中读取图片,包括一个单元格多张图片

发布时间 2023-07-06 17:48:26作者: 凉风青枼

读取图片仅测试xlsx版,如果xls版不读,就把那个转出xlsx

具体代码,此处的源码都是基于hutool源码修改

`public static Map<String, List> getPicMap(Workbook workbook, int sheetIndex) {
Assert.notNull(workbook, "Workbook must be not null !");
if (sheetIndex < 0) {
sheetIndex = 0;
}

    if (workbook instanceof HSSFWorkbook) {
        return getPicMapXls((HSSFWorkbook) workbook, sheetIndex);
    } else if (workbook instanceof XSSFWorkbook) {
        return getPicMapXlsx((XSSFWorkbook) workbook, sheetIndex);
    } else {
        throw new IllegalArgumentException(StrUtil.format("Workbook type [{}] is not supported!", workbook.getClass()));
    }
}`

`private static Map<String, List<PictureData>> getPicMapXls(HSSFWorkbook workbook, int sheetIndex) {

    final List<HSSFPictureData> pictures = workbook.getAllPictures();
    final Map<String, List<PictureData>> sheetIndexPicListMap = new HashMap<>();
    if (CollectionUtil.isNotEmpty(pictures)) {
        final HSSFSheet sheet = workbook.getSheetAt(sheetIndex);
        HSSFClientAnchor anchor;
        int pictureIndex;
        for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
            if (shape instanceof HSSFPicture) {
                pictureIndex = ((HSSFPicture) shape).getPictureIndex() - 1;
                anchor = (HSSFClientAnchor) shape.getAnchor();
                String key = StrUtil.format("{}_{}", anchor.getRow1(), anchor.getCol1());
                List<PictureData> list = sheetIndexPicListMap.getOrDefault(key, new ArrayList<>());
                list.add(pictures.get(pictureIndex));
                sheetIndexPicListMap.put(key,list);
            }
        }
    }
    return sheetIndexPicListMap;
}`

`private static Map<String, List> getPicMapXlsx(XSSFWorkbook workbook, int sheetIndex) {

    final Map<String, List<PictureData>> sheetIndexPicListMap = new HashMap<>();
    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) {
                if(shape instanceof XSSFPicture){
                    pic = (XSSFPicture) shape;
                    ctMarker = pic.getPreferredSize().getFrom();
                    String key = StrUtil.format("{}_{}", ctMarker.getRow(), ctMarker.getCol());
                    List<PictureData> list = sheetIndexPicListMap.getOrDefault(key, new ArrayList<>());
                    list.add(pic.getPictureData());
                    sheetIndexPicListMap.put(key,list);
                }
                // 其他类似于图表等忽略,see: https://gitee.com/dromara/hutool/issues/I38857
            }
        }
    }
    return sheetIndexPicListMap;
}
// -------------------------------------------------------------------------------------------------------------- Private method end

`