• 售前

  • 售后

热门帖子
入门百科

Python xlwings插入Excel图片的实现方法

[复制链接]
123457875 显示全部楼层 发表于 2021-10-25 20:04:22 |阅读模式 打印 上一主题 下一主题
测试图片


一、相对路径(报错)

使用相对路径插入会报错(确认路径准确无误)
  1. import xlwings as xw
  2. wb = xw.Book()
  3. sht = wb.sheets['Sheet1']
  4. sht.pictures.add('1.jpg') # 使用相对路径会报错
  5. wb.save('test.xlsx')
  6. wb.close()
复制代码
  1. File "<COMObject <unknown>>", line 5, in AddPicture
  2. pywintypes.com_error: (-2147352567, '发生意外。', (0, None, '未找到指定文件。', None, 0, -2146827284), None)
复制代码
二、绝对路径

改为绝对路径即可乐成插入
  1. import os
  2. import xlwings as xw
  3. wb = xw.Book()
  4. sht = wb.sheets['Sheet1']
  5. # sht.pictures.add('1.jpg') # 使用相对路径会报错
  6. sht.pictures.add(os.path.join(os.getcwd(), '1.jpg'))
  7. wb.save('test.xlsx')
  8. wb.close()
复制代码

三、指定位置和巨细

函数原型
  1. add(image, link_to_file=False, save_with_document=True, left=0, top=0, width=None, height=None, name=None, update=False)
复制代码
  1. import os
  2. import xlwings as xw
  3. wb = xw.Book()
  4. sht = wb.sheets['Sheet1']
  5. fileName = os.path.join(os.getcwd(), '1.jpg')
  6. sht.pictures.add(fileName, left=sht.range('B5').left, top=sht.range('B5').top, width=100, height=100)
  7. wb.save('test.xlsx')
  8. wb.close()
复制代码
指定图片位置为
  1. B5
复制代码
单元格的左上角,图片像素为
  1. 100×100
复制代码


四、居中插入

新建Excel文件
  1. test.xlsx
复制代码
,设置列宽20行高100

  1. import os
  2. import xlwings as xw
  3. wb = xw.Book('test.xlsx') # 打开已存在的Excel文件
  4. sht = wb.sheets['Sheet1']
  5. rng = sht.range('B2') # 目标单元格
  6. fileName = os.path.join(os.getcwd(), '1.jpg')
  7. width, height = 80, 80 # 指定图片大小
  8. left = rng.left + (rng.width - width) / 2 # 居中
  9. top = rng.top + (rng.height - height) / 2
  10. sht.pictures.add(fileName, left=left, top=top, width=width, height=height)
  11. wb.save()
  12. wb.close()
复制代码

智能居中插入
1.jpg
宽 × 高 = 188 × 282



2.jpg
宽 × 高 = 200 × 153

  1. import os
  2. import xlwings as xw
  3. from PIL import Image
  4. def add_center(sht, target, filePath, match=False, width=None, height=None, column_width=None, row_height=None):
  5.   '''Excel智能居中插入图片
  6.   优先级:match > width & height > column_width & row_height
  7.   建议使用column_width或row_height,定义单元格最大宽或高
  8.   :param sht: 工作表
  9.   :param target: 目标单元格,字符串,如'A1'
  10.   :param filePath: 图片绝对路径
  11.   :param width: 图片宽度
  12.   :param height: 图片高度
  13.   :param column_width: 单元格最大宽度,默认100像素,0 <= column_width <= 1557.285
  14.   :param row_height: 单元格最大高度,默认75像素,0 <= row_height <= 409.5
  15.   :param match: 绝对匹配原图宽高,最大宽度1557.285,最大高度409.5
  16.   '''
  17.   unit_width = 6.107 # Excel默认列宽与像素的比
  18.   rng = sht.range(target) # 目标单元格
  19.   name = os.path.basename(filePath) # 文件名
  20.   _width, _height = Image.open(filePath).size # 原图片宽高
  21.   NOT_SET = True # 未设置单元格宽高
  22.   # match
  23.   if match: # 绝对匹配图像
  24.     width, height = _width, _height
  25.   else: # 不绝对匹配图像
  26.     # width & height
  27.     if width or height:
  28.       if not height: # 指定了宽,等比计算高
  29.         height = width / _width * _height
  30.       if not width: # 指定了高,等比计算宽
  31.         width = height / _height * _width
  32.     else:
  33.       # column_width & row_height
  34.       if column_width and row_height: # 同时指定单元格最大宽高
  35.         width = row_height / _height * _width # 根据单元格最大高度假设宽
  36.         height = column_width / _width * _height # 根据单元格最大宽度假设高
  37.         area_width = column_width * height # 假设宽优先的面积
  38.         area_height = row_height * width # 假设高优先的面积
  39.         if area_width > area_height:
  40.           width = column_width
  41.         else:
  42.           height = row_height
  43.       elif not column_width and not row_height: # 均无指定单元格最大宽高
  44.         column_width = 100
  45.         row_height = 75
  46.         rng.column_width = column_width / unit_width # 更新当前宽度
  47.         rng.row_height = row_height # 更新当前高度
  48.         NOT_SET = False
  49.         width = row_height / _height * _width # 根据单元格最大高度假设宽
  50.         height = column_width / _width * _height # 根据单元格最大宽度假设高
  51.         area_width = column_width * height # 假设宽优先的面积
  52.         area_height = row_height * width # 假设高优先的面积
  53.         if area_width > area_height:
  54.           height = row_height
  55.         else:
  56.           width = column_width
  57.       else:
  58.         width = row_height / _height * _width if row_height else column_width # 仅设了单元格最大宽度
  59.         height = column_width / _width * _height if column_width else row_height # 仅设了单元格最大高度
  60.   assert 0 <= width / unit_width <= 255
  61.   assert 0 <= height <= 409.5
  62.   if NOT_SET:
  63.     rng.column_width = width / unit_width # 更新当前宽度
  64.     rng.row_height = height # 更新当前高度
  65.   left = rng.left + (rng.width - width) / 2 # 居中
  66.   top = rng.top + (rng.height - height) / 2
  67.   try:
  68.     sht.pictures.add(filePath, left=left, top=top, width=width, height=height, scale=None, name=name)
  69.   except Exception: # 已有同名图片,采用默认命名
  70.     pass
  71. if __name__ == '__main__':
  72.   wb = xw.Book()
  73.   sht = wb.sheets['Sheet1']
  74.   filePath = os.path.join(os.getcwd(), '1.jpg')
  75.   filePath2 = os.path.join(os.getcwd(), '2.jpg')
  76.   add_center(sht, 'A1', filePath) # 默认值
  77.   add_center(sht, 'B2', filePath2) # 默认值
  78.   add_center(sht, 'C3', filePath, match=True) # 绝对匹配图片宽高
  79.   add_center(sht, 'D4', filePath, width=100) # 图片宽度为100像素
  80.   add_center(sht, 'E5', filePath, height=100) # 图片高度为100像素
  81.   add_center(sht, 'F6', filePath, width=100, height=100) # 图片高度为100像素
  82.   add_center(sht, 'G7', filePath, column_width=100) # 单元格最大宽度为100像素
  83.   add_center(sht, 'H8', filePath, row_height=100) # 单元格最大宽度为100像素
  84.   add_center(sht, 'I9', filePath, column_width=100, row_height=100) # 单元格最大高度或宽度为100像素
复制代码
效果

unit_width = 6.107 # Excel默认列宽与像素的比

这个值估计与差别机器、分辨率有关,在5.7-6.2之间
遇到的坑

报错
  1. pywintypes.com_error: (-2147352567, '发生意外。', (0, None, '未找到指定文件。', None, 0, -2146827284), None)
复制代码
对路径使用
  1. os.path.abspath()
复制代码
参考文献

xlwings dev documentation
报错pywintypes.com_error: (-2147352567, ‘发生意业务外。‘, (0, None, ‘未找到指定文件。‘, None, 0, -2146827284), None)
到此这篇关于Python xlwings插入Excel图片的实现方法的文章就介绍到这了,更多相干Python xlwings插入图片内容请搜刮草根技术分享从前的文章或继续浏览下面的相干文章希望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作