Excel嵌入图片至单元格----by华南组
回答
收藏

Excel嵌入图片至单元格----by华南组

驿
驿站
2023-05-09 17:03·浏览量:5532
驿
驿站
影刀见习开发者
发布于 2023-05-09 17:035532浏览

作者:驿站、肯尼


一、方式一:半嵌入

优点:图片可以随着单元格大小改变而改变,使用简单

缺点:图片会被鼠标挪动


1.1 实现原理

https://zhuanlan.zhihu.com/p/507602626


1.2 使用代码

from openpyxl import Workbook, load_workbook
from openpyxl.drawing.image import Image
from openpyxl.drawing.spreadsheet_drawing import AnchorMarker, TwoCellAnchor


def insert_img_to_cell(excel_path, sheet_name, img_path, col, row, padding=1000):
	"""
    插入图片至单元格
    :param excel_path: 表格路径
    :param sheet_name: 工作表名称
    :param img_path: 图片路径
    :param col: 插入单元格列
    :param row: 插入单元格行
    :param padding: 单元格边距
    :return:
    """

	wb = load_workbook(excel_path)
	ws = wb[sheet_name]
	img = Image(img_path)
	_from = AnchorMarker(col - 1, padding, row - 1, padding)
	to = AnchorMarker(col, -padding, row, -padding)
	img.anchor = TwoCellAnchor('twoCell', _from, to)

	ws.add_image(img)
	wb.save(excel_path)



二、方式二:完全嵌入

优点:完全嵌入

缺点:

  • 使用复杂
  • 原来表格必须有一张图片嵌入才可以用
  • 只能用于wps


2.1实现原理

当我们手动嵌入图片的时候,会看到单元格有一个公式:=DISPIMG("ID_8313E798FE514EF8BCD348843D64D276",1),这个公式最主要的就是第一个参数,第二个参数我也不知道有啥用。现在就让我们来找一找这第一个参数怎么来的

众所周知,表格文件是一个压缩文件,直接用压缩软件打开它。


先看第一个文件:xl/_rels/cellimages.xml.rels

这里标记了两个图片路径,还有一个Id

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships
    xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.png"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>
</Relationships>



再来看第二个文件:xl/cellimages.xml

在这里我们看到了公式里面的第一个参数: ID_8313E798FE514EF8BCD348843D64D276

在下面还有一个 rId1 和第一个文件的 rId1对应

            <xdr:nvPicPr>
                <xdr:cNvPr id="2" name="ID_8313E798FE514EF8BCD348843D64D276" descr="150x150"/>
                <xdr:cNvPicPr>
                    <a:picLocks noChangeAspect="1"/>
                </xdr:cNvPicPr>
            </xdr:nvPicPr>
            <xdr:blipFill>
                <a:blip r:embed="rId1"/>
                <a:stretch>
                    <a:fillRect/>
                </a:stretch>
            </xdr:blipFill>



第三个文件:xl/worksheets/sheet1.xml

这里又看到了熟悉的公式,和表格里的一模一样

    <sheetData>
        <row r="2" ht="75" spans="2:2">
            <c r="B2" t="str">
                <f>_xlfn.DISPIMG(&quot;ID_8313E798FE514EF8BCD348843D64D276&quot;,1)</f>
                <v>=DISPIMG(&quot;ID_8313E798FE514EF8BCD348843D64D276&quot;,1)</v>
            </c>
        </row>
        <row r="5" ht="75" spans="2:2">
            <c r="B5" t="str">
                <f>_xlfn.DISPIMG(&quot;ID_AD62005A1042438DB5AAF1F80CFFDAB7&quot;,1)</f>
                <v>=DISPIMG(&quot;ID_AD62005A1042438DB5AAF1F80CFFDAB7&quot;,1)</v>
            </c>
        </row>
    </sheetData>



所以,整体的映射关系就是

  • 从 xl/worksheets/sheet.xml 中获取的公式的第一个参数 ID
  • 通过ID 从 xl/cellimages.xml 找到rId1
  • 再通过rId 从 xl/_rels/cellimages.xml.rels 中找到图片路径


接下来到了简单的CV环节,通过代码把映射关系建立起来即可



2.2 使用代码

代码太长,发布不出来,点击下方链接查看

https://www.bilibili.com/read/cv23570588

收藏1
全部回答1
最新
发布回答
回答