0
点赞
收藏
分享

微信扫一扫

Spring Boot入门指南:留言板

q松_松q 2024-08-01 阅读 28

注意:是嵌入在单元格里的图片,嵌入在单元格里的图片,嵌入在单元格里的图片
会显示这种类似的命令(office好像不支持查看,wps可以查看这个位置显示的图片)
在这里插入图片描述

网上好多都说用 _image 提取,经测试,这种方案不适用这种嵌入在单元格里的图片提取

查阅资料发现,xlsx文件 本质上也是一种特殊的压缩文件,所以,把xlsx文件后缀改成zip,即可得到类似这种结构

在这里插入图片描述

在 /xl 下找到 cellimages.xml 文件 ,这个文件就是存放图片和对应名称关系的xml文件
/xl/media 文件夹下存放的是所有嵌入的图片(有重复的只会存一个)

cellimages.xml文件中,下图中圈出来的就是 excel里图片插入位置显示的代码和/xl/media下图片名之间的关系
在这里插入图片描述
“ID_B980C4566868422BA0D7FCE7587B7A7A” 这个是excel里显示的代码
<a:blip r:embed=“rId1” r:link=“rId2”/> 里的r:embed=“rId1” ,rId1 最后一个就是对应的图片名也就是对应image1.png
在这里插入图片描述

还有要注意的是, r:embed=“rId1” 里的rid 后边的数字,当数字大于2时,减1等于图片对应的后缀名
(不知道其它文件是不是也是这种情况)

实现样例代码

    def read_file_save(self,file,save_file):
        """

        :param file:
        :param save_file:
        :return:
        """
        image = self.mark.read_image(file)
        self.mark.save_image(image,save_file)




    def read_xml(self,file):
        """

        :param file:
        :return:
        """
        with open(file,"r",encoding="utf-8")as fp:
           data = fp.read()

        res = re.findall('xdr:cNvPr id="(\d+)" name="(.*?)"/>',data)
        res2 = re.findall('r:embed="rId(\d+)" r:link',data)

        print(res,res2)
        print(len(res),len(res2))
        for index,(ind,name) in enumerate(res):
            ind2 = str(int(res2[index])-1) if int(res2[index])>2 else res2[index]
            img_file = rf"D:\Desktop\1\9\副本\xl\media\image{ind2}.png"
            print(ind,name,ind2,img_file)
            save_file = rf"D:\Desktop\1\9\副本\xl\media2\{name}.jpg"
            self.read_file_save(img_file,save_file)
举报

相关推荐

0 条评论