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


Posted in Python onFebruary 26, 2021

测试图片

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

一、相对路径(报错)

使用相对路径插入会报错(确认路径正确无误)

import xlwings as xw

wb = xw.Book()
sht = wb.sheets['Sheet1']
sht.pictures.add('1.jpg') # 使用相对路径会报错
wb.save('test.xlsx')
wb.close()

File "<COMObject <unknown>>", line 5, in AddPicture
pywintypes.com_error: (-2147352567, '发生意外。', (0, None, '未找到指定文件。', None, 0, -2146827284), None)

二、绝对路径

改为绝对路径即可成功插入

import os
import xlwings as xw

wb = xw.Book()
sht = wb.sheets['Sheet1']
# sht.pictures.add('1.jpg') # 使用相对路径会报错
sht.pictures.add(os.path.join(os.getcwd(), '1.jpg'))
wb.save('test.xlsx')
wb.close()

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

三、指定位置和大小

函数原型add(image, link_to_file=False, save_with_document=True, left=0, top=0, width=None, height=None, name=None, update=False)

import os
import xlwings as xw

wb = xw.Book()
sht = wb.sheets['Sheet1']
fileName = os.path.join(os.getcwd(), '1.jpg')
sht.pictures.add(fileName, left=sht.range('B5').left, top=sht.range('B5').top, width=100, height=100)
wb.save('test.xlsx')
wb.close()

指定图片位置为B5单元格的左上角,图片像素为100×100

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

四、居中插入

新建Excel文件test.xlsx,设置列宽20行高100

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

import os
import xlwings as xw

wb = xw.Book('test.xlsx') # 打开已存在的Excel文件
sht = wb.sheets['Sheet1']
rng = sht.range('B2') # 目标单元格
fileName = os.path.join(os.getcwd(), '1.jpg')
width, height = 80, 80 # 指定图片大小
left = rng.left + (rng.width - width) / 2 # 居中
top = rng.top + (rng.height - height) / 2
sht.pictures.add(fileName, left=left, top=top, width=width, height=height)
wb.save()
wb.close()

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

智能居中插入

1.jpg

宽 × 高 = 188 × 282

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

2.jpg

宽 × 高 = 200 × 153

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

import os
import xlwings as xw
from PIL import Image


def add_center(sht, target, filePath, match=False, width=None, height=None, column_width=None, row_height=None):
  '''Excel智能居中插入图片

  优先级:match > width & height > column_width & row_height
  建议使用column_width或row_height,定义单元格最大宽或高

  :param sht: 工作表
  :param target: 目标单元格,字符串,如'A1'
  :param filePath: 图片绝对路径
  :param width: 图片宽度
  :param height: 图片高度
  :param column_width: 单元格最大宽度,默认100像素,0 <= column_width <= 1557.285
  :param row_height: 单元格最大高度,默认75像素,0 <= row_height <= 409.5
  :param match: 绝对匹配原图宽高,最大宽度1557.285,最大高度409.5
  '''
  unit_width = 6.107 # Excel默认列宽与像素的比
  rng = sht.range(target) # 目标单元格
  name = os.path.basename(filePath) # 文件名
  _width, _height = Image.open(filePath).size # 原图片宽高
  NOT_SET = True # 未设置单元格宽高
  # match
  if match: # 绝对匹配图像
    width, height = _width, _height
  else: # 不绝对匹配图像
    # width & height
    if width or height:
      if not height: # 指定了宽,等比计算高
        height = width / _width * _height
      if not width: # 指定了高,等比计算宽
        width = height / _height * _width
    else:
      # column_width & row_height
      if column_width and row_height: # 同时指定单元格最大宽高
        width = row_height / _height * _width # 根据单元格最大高度假设宽
        height = column_width / _width * _height # 根据单元格最大宽度假设高
        area_width = column_width * height # 假设宽优先的面积
        area_height = row_height * width # 假设高优先的面积
        if area_width > area_height:
          width = column_width
        else:
          height = row_height
      elif not column_width and not row_height: # 均无指定单元格最大宽高
        column_width = 100
        row_height = 75
        rng.column_width = column_width / unit_width # 更新当前宽度
        rng.row_height = row_height # 更新当前高度
        NOT_SET = False
        width = row_height / _height * _width # 根据单元格最大高度假设宽
        height = column_width / _width * _height # 根据单元格最大宽度假设高
        area_width = column_width * height # 假设宽优先的面积
        area_height = row_height * width # 假设高优先的面积
        if area_width > area_height:
          height = row_height
        else:
          width = column_width
      else:
        width = row_height / _height * _width if row_height else column_width # 仅设了单元格最大宽度
        height = column_width / _width * _height if column_width else row_height # 仅设了单元格最大高度
  assert 0 <= width / unit_width <= 255
  assert 0 <= height <= 409.5
  if NOT_SET:
    rng.column_width = width / unit_width # 更新当前宽度
    rng.row_height = height # 更新当前高度
  left = rng.left + (rng.width - width) / 2 # 居中
  top = rng.top + (rng.height - height) / 2
  try:
    sht.pictures.add(filePath, left=left, top=top, width=width, height=height, scale=None, name=name)
  except Exception: # 已有同名图片,采用默认命名
    pass


if __name__ == '__main__':
  wb = xw.Book()
  sht = wb.sheets['Sheet1']
  filePath = os.path.join(os.getcwd(), '1.jpg')
  filePath2 = os.path.join(os.getcwd(), '2.jpg')

  add_center(sht, 'A1', filePath) # 默认值
  add_center(sht, 'B2', filePath2) # 默认值
  add_center(sht, 'C3', filePath, match=True) # 绝对匹配图片宽高
  add_center(sht, 'D4', filePath, width=100) # 图片宽度为100像素
  add_center(sht, 'E5', filePath, height=100) # 图片高度为100像素
  add_center(sht, 'F6', filePath, width=100, height=100) # 图片高度为100像素
  add_center(sht, 'G7', filePath, column_width=100) # 单元格最大宽度为100像素
  add_center(sht, 'H8', filePath, row_height=100) # 单元格最大宽度为100像素
  add_center(sht, 'I9', filePath, column_width=100, row_height=100) # 单元格最大高度或宽度为100像素

效果

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

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

这个值估计与不同机器、分辨率有关,在5.7-6.2之间

遇到的坑

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

参考文献

 xlwings dev documentation

报错pywintypes.com_error: (-2147352567, ‘发生意外。‘, (0, None, ‘未找到指定文件。‘, None, 0, -2146827284), None)

到此这篇关于Python xlwings插入Excel图片的实现方法的文章就介绍到这了,更多相关Python xlwings插入图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
python 回溯法模板详解
Feb 26 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
pandas实现导出数据的四种方式
Dec 13 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 #Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 #Python
详解python的xlwings库读写excel操作总结
Feb 26 #Python
pytorch 中forward 的用法与解释说明
Feb 26 #Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 #Python
pycharm Tab键设置成4个空格的操作
Feb 26 #Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 #Python
You might like
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
类似框架的js代码
2006/11/09 Javascript
JS 判断代码全收集
2009/04/28 Javascript
JS实现self的resend
2010/07/22 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python Socket编程入门教程
2014/07/11 Python
TensorFlow损失函数专题详解
2018/04/26 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
公司联欢会策划方案
2014/05/19 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
标准发言稿结尾
2019/07/18 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
python实现socket简单通信的示例代码
2021/04/13 Python
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js