Java读取Excel表格中的图片

前言

excel的图片并不是直接嵌入单元格中的,但是在插入图片时可以设置图片格式,将图片放入单元格中,代码就可以根据行号与列号定位到响应的图片。

Java读取Excel表格中的图片_第1张图片

读取图片

不同版本的excel有不同的拓展名(.xls .xlsx),对应不同的方法。

所有的图片在excel中保存在一个集合中,以行列号为key,图片为value,将结果封装到map集合中,图片的格式为“HSSFPictureData”“XSSFPictureData”。

/**
 * 获取图片和位置 (xls)
 * @param sheet
 * @return
 * @throws IOException
 */
public static Map getPictures (HSSFSheet sheet) throws IOException {
    Map map = new HashMap();
    List list = sheet.getDrawingPatriarch().getChildren();
    for (HSSFShape shape : list) {
        if (shape instanceof HSSFPicture) {
            HSSFPicture picture = (HSSFPicture) shape;
            HSSFClientAnchor cAnchor = picture.getClientAnchor();
            HSSFPictureData pdata = picture.getPictureData();
            String key = cAnchor.getRow1() + "-" + cAnchor.getCol1(); // 行号-列号
            map.put(key, pdata);
        }
    }
    return map;
}
 
/**
 * 获取图片和位置 (xlsx)
 * @param sheet
 * @return
 * @throws IOException
 */
public static Map getPictures (XSSFSheet sheet) throws IOException {
    Map map = new HashMap();
    List list = sheet.getRelations();
    for (POIXMLDocumentPart part : list) {
        if (part instanceof XSSFDrawing) {
            XSSFDrawing drawing = (XSSFDrawing) part;
            List shapes = drawing.getShapes();
            for (XSSFShape shape : shapes) {
                XSSFPicture picture = (XSSFPicture) shape;
                XSSFClientAnchor anchor = picture.getPreferredSize();
                CTMarker marker = anchor.getFrom();
                String key = marker.getRow() + "-" + marker.getCol();
                map.put(key, picture.getPictureData());
            }
        }
    }
    return map;
}

 从map拿到图片使用输出流将图片保存在本地

    PictureData picData = map.get(hang-1+":"+20);
    //String ext = picData.suggestFileExtension();//获取图片的后缀名
    byte[] data = picData.getData();
    String fileName = UUID.randomUUID().toString();
    //文件夹路径:temporarypath 
    String temporarypath = FtpPropertiesLoader.get("temporarypath");
    FileOutputStream out = new FileOutputStream(temporarypath + fileName + ".jpg");
    out.write(data); 
    out.close();

你可能感兴趣的:(代码,java,开发语言,后端)