Skip to content

A 读取Excel中的图片

guanquan.wang edited this page Jan 7, 2025 · 4 revisions

导出图片请查看章节1-导出Excel#导出图片

从v0.4.12版本开始支持读取excel文件中的图片,目前有两种途径获取图片信息,一是从ExcelReader中获取所有图片,另一个是从各Worksheet中获取当前Worksheet包含的图片。

v0.5.12支持读取WPS的内嵌图片,读取方法不变listPictures将返回所有图片

// 从Workbook中获取所有图片
List<Drawings.Picture> pictures = reader.listPictures();

// 取第一个worksheet中包含的图片
List<Drawings.Picture> pictures = reader.sheet(0).listPictures();

返回的Drawings.Picture类型,包含Worksheet,位置,本地临时路径,网络图片URL(如果是联机图片)以及是否为背景图片等信息,拿到本地临时路径后就可以将图片复制到其它任意位置,另外这里的位置信息是图片左上和右下在单元格的行列位置,对象为Dimension它包含"首行", "首列", "末行", "末列" 4个位置,例如:下图中图片在worksheet的位置为C39:H52

drawing-dimension.png

下面方法实现图片复制功能

// From workbook
List<Drawings.Picture> pictures = reader.listPictures();

// 如果excel不包含图片则pictures为NULL,所以防止NPE这里判断pictures
if (pictures != null) {
    // Copy images
    for (Drawings.Picture pic : pictures) {
        // 将图片复制到d盘
        Path dest = Paths.get("F:/excel", pic.sheet.getName(), pic.localPath.getFileName().toString());
        if (!Files.exists(dest.getParent())) FileUtil.mkdir(dest.getParent());
        Files.copy(pic.localPath, dest, StandardCopyOption.REPLACE_EXISTING);
    }
}

v0.4.13支持xls的图片读取,方法与xlsx完全一样

Document.png

xls图片保存在Workbook globals里,它处于Wroksheet之前,但是通过解析globals并不知道图片由哪个Worksheet引用,引用信息(包含位置信息)存在于各个Worksheet的末尾,为了避免过度解析,默认只记录global里图片的起始位置,调用#listPictures方法时才会解析图片,调用Picture#getSheet()或者Picture#getDimension()时解析引用信息。

注意:本地临时路径在关闭ExcelReader后会自动清除,如果想要永久保存图片则需要将其复制到其它地方

Clone this wiki locally