Python实现Excel文件拷贝图片到另一个的Excel文件(保持原有图片比例)

news2024/12/24 8:54:18

Python实现Excel文件拷贝图片到另一个的Excel文件(保持原有图片比例)

  • 1、前言
    • 1.1 成功拷贝但是比例错误
    • 1.2 直接报错
  • 2、解决办法
  • 3、号外

1、前言

今天朋友给我一个需求,需要把xlsx文件中的图片拷贝到另一个xlsx中,但是试过网上比较普遍的几种方法,都不能达到很好的效果,比如下面几种方法:

1.1 成功拷贝但是比例错误

from openpyxl import Workbook
from openpyxl import load_workbook

# 加载工作簿和工作表
wb = load_workbook("test.xlsx")
ws = wb[wb.sheetnames[0]]

# 创建新的工作簿和工作表
new_wb = Workbook()
new_ws = new_wb.active

# 遍历原始工作表中的图片
for img in ws._images:
    new_ws.add_image(img)

# 保存新的工作簿
new_wb.save("output.xlsx")

源文件:

在这里插入图片描述
拷贝后的文件:

在这里插入图片描述

1.2 直接报错

from openpyxl import load_workbook
from openpyxl.drawing.image import Image

# 打开源文件和目标文件
source_file = "test.xlsx"
target_file = "output.xlsx"

# 加载源文件和目标文件
source_workbook = load_workbook(source_file)
target_workbook = load_workbook(target_file)

# 获取源文件和目标文件的第一个Sheet
source_sheet = source_workbook.active
target_sheet = target_workbook.active

# 遍历源Sheet中的图片,并拷贝到目标Sheet
for image in source_sheet._images:
    # 获取图片的坐标和文件路径
    image_coordinate = image.anchor
    image_path = image.filename

    # 从源文件中读取图片,然后在目标文件中插入图片
    with open(image_path, "rb") as f:
        img = Image(f)
        target_sheet.add_image(img, image_coordinate)

# 保存目标文件
target_workbook.save("output.xlsx")

报错如下:

Traceback (most recent call last):
  File "C:\Users\HUAWEI\Desktop\pythonProject\e.py", line 20, in <module>
    image_path = image.filename
AttributeError: 'Image' object has no attribute 'filename'

2、解决办法

网上查了很多方法,发现有一种方法大家很少提及,就是把xlsx文件转换为zip文件再进行解压提取照片,测试过是有效的,原理是这样的:

  1. 将待读取的excel文件后缀名改成zip,变成压缩文件。
  2. 再解压这个文件。
  3. 在解压后的文件夹中,就有excel中的图片。
  4. 这样读excel中的图片,就变成了读文件夹中的图片了,和普通文件一样,可以做各种处理。

解压后的压缩包如下,成功把图片提取出来了,后续插入新xlsx可以从这里提取操作:

在这里插入图片描述

代码如下:

import os
import zipfile


# 判断是否是文件和判断文件是否存在
def isfile_exist(file_path):
    if not os.path.isfile(file_path):
        print("It's not a file or no such file exist ! %s" % file_path)
        return False
    else:
        return True


# 修改指定目录下的文件类型名,将excel后缀名修改为.zip
def change_file_name(file_path, new_type='.zip'):
    if not isfile_exist(file_path):
        return ''
    extend = os.path.splitext(file_path)[1]  # 获取文件拓展名
    if extend != '.xlsx' and extend != '.xls':
        print("It's not a excel file! %s" % file_path)
        return False
    file_name = os.path.basename(file_path)  # 获取文件名
    new_name = str(file_name.split('.')[0]) + new_type  # 新的文件名,命名为:xxx.zip
    dir_path = os.path.dirname(file_path)  # 获取文件所在目录
    new_path = os.path.join(dir_path, new_name)  # 新的文件路径
    if os.path.exists(new_path):
        os.remove(new_path)
    os.rename(file_path, new_path)  # 保存新文件,旧文件会替换掉
    return new_path  # 返回新的文件路径,压缩包


# 解压文件
def unzip_file(zipfile_path):
    if not isfile_exist(zipfile_path):
        return False
    if os.path.splitext(zipfile_path)[1] != '.zip':
        print("It's not a zip file! %s" % zipfile_path)
        return False
    file_zip = zipfile.ZipFile(zipfile_path, 'r')
    file_name = os.path.basename(zipfile_path)  # 获取文件名
    zipdir = os.path.join(os.path.dirname(zipfile_path), str(file_name.split('.')[0]))  # 获取文件所在目录
    for files in file_zip.namelist():
        file_zip.extract(files, os.path.join(zipfile_path, zipdir))  # 解压到指定文件目录
    file_zip.close()
    return True


# 读取解压后的文件夹,打印图片路径
def read_img(zipfile_path):
    if not isfile_exist(zipfile_path):
        return False
    dir_path = os.path.dirname(zipfile_path)  # 获取文件所在目录
    file_name = os.path.basename(zipfile_path)  # 获取文件名
    pic_dir = 'xl' + os.sep + 'media'  # excel变成压缩包后,再解压,图片在media目录
    pic_path = os.path.join(dir_path, str(file_name.split('.')[0]), pic_dir)
    file_list = os.listdir(pic_path)
    for file in file_list:
        filepath = os.path.join(pic_path, file)
        print(filepath)


# 组合各个函数
def compenent(excel_file_path):
    zip_file_path = change_file_name(excel_file_path)
    if zip_file_path != '':
        if unzip_file(zip_file_path):
            read_img(zip_file_path)


# main
if __name__ == '__main__':
    compenent('C:/Users/HUAWEI/Desktop/pythonProject/test.xlsx')

3、号外

  1. 如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!
  2. 【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 定制源码】大学生毕设模板、期末大作业模板 、Echarts大数据可视化等! 「一起探讨 ,互相学习」!(vx:python812146)
  3. 以上内容技术相关问题😈欢迎一起交流学习👇🏻👇🏻👇🏻🔥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git超级详细使用

一、概述 1.1 、git工作流程 命令如下&#xff1a; 1. clone (克隆):从远程仓库中克隆代码到本地仓库 2. checkout(检出) :从本地仓库中检出一个仓库分支然后进行修订add &#xff08;添加):在提交前先将代码提交到暂存区 3. commit(提交)︰提交到本地仓库。本地仓库中保存修…

“管理Layui树形图,提高页面交互性与可视化效果“

标题&#xff1a;管理Layui树形图&#xff0c;提高页面交互性与可视化效果 Layui树形图简介一、引入Layui和jQuery库&#xff1a;二、HTML结构准备&#xff1a;三、初始化树形图&#xff1a;四、配置树形图的其他属性和事件&#xff1a;4.1 实体类4.2 PermissionDao方法4.3 Per…

【crash】浮点除0堆损坏

摘要&#xff1a;工作中遇到一个crash&#xff0c;其现象真实的crash原因差别比较大&#xff0c;和我自身原本了解的只是冲突&#xff0c;因此在本片文档中简单描述下。关键字&#xff1a;除0、IEEE754 1 前情提要 QA测试过程发现一个比较奇怪的crash&#xff0c;只会在特定机…

python爬虫-获取headers(报文头)关键参数实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;请求页面&#xff0c;得到响应。建议首次请求时headers内容都带着&#xff0c;调试…

OpenCV入坑第一天:图像的基础操作

我们都知道&#xff0c;OpenCV能够帮助我们处理视频和图像&#xff0c;咱们在图像处理中&#xff0c;除了Pillow库之外&#xff0c;最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python&#xff0c;一起来感受一下OpenCV的魅力吧&#xff01; 文章目录 读取图像 im…

GAMES101笔记 Lecture11 Geometry 2(Curces and Surfaces)

目录 Explicit Representations in Computer Graphics(计算机图形学中的显式几何表示)Point Cloud(点云)Polygon Mesh(多边形网格)The Wavefront Object File(.obj) Format(OBJ格式文件) Curves(曲线)Bezier Curves(贝塞尔曲线)Defining Cubic Bezier Curve With Tangents(定义…

el-checkbox和el-switch绑定一个Number值

因为我们对状态这种字段&#xff0c;后端一般返回的是Number值。0为正常&#xff0c;1为停用。 el-switch&#xff0c;el-checkbox这种控件呢&#xff0c;一般是绑定布尔值的。原来我的做法是使用value和change事件来做转换&#xff0c;而不是v-model。但是后来发现&#xff0c…

row_number 和 cte 使用实例:按照队列进行数据抵消

row_number 和 cte 使用实例:按照队列进行数据抵消 问题来源模拟数据使用 cte使用sum结合开窗函数结合 row_number 最终实现完整的模拟代码小结问题来源 今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,…

二次元少女-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 模型版本&#xff1a;chilloutmix_NiPrunedFp32Fix.safetensors 采样方法(Sampler)Sampling method&#xff1a;DPM SDE …

Elasticsearch--客户端

Es客户端 语言无关 ​ java最常用的客户端是Java Client、Java Rest Client、Java Transport Client Java Client 从es7.17开始&#xff0c;官方推出Java Client&#xff0c;并且将Java Rest Client标为Deprecated&#xff08;过期&#xff09; 要求jdk至少要jdk8 具体用法…

大模型技术发展概述 -(四)

文本内容参考论文《A Survey of Large Language Models》 论文标题&#xff1a;A Survey of Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -&#xff08;四&#xff09; 6. 使用方法6.1 上下文学习6.1.1 提示形式6.…

网络套接字编程(三)(HTTP)

gitee仓库&#xff1a;https://gitee.com/WangZihao64/linux/tree/master/CalTcp 一、重谈协议 协议是一种“约定”&#xff0c;这种约定是双方都知道的。有了一致的约定&#xff0c;双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过&#xff0c;协议是双方进行通…

uniapp中H5定位功能实现

1.要实现该功能 必须使用vue-jsonp进行跨域 JSONP是一种跨域数据请求的解决方案&#xff0c;它使用script元素来请求数据&#xff0c;再利用回调函数将数据传回页面。 Vue框架提供了对JSONP的支持&#xff0c;可以方便地在Vue应用中使用JSONP获取跨域数据。下面我们来了解一下…

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的&#xff0c;在每次进行修改操作时&#xff0c;都不会产生新的对象&#xff0c;所以在进行修改的时候&#xff0c;尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

keepalived安装配置详解

文章目录 高可用介绍keepalived安装、使用vip漂移抓包脑裂脑裂有没有危害&#xff1f;如果有危害对业务有什么影响&#xff1f; keepalived架构双vip架构 Healthcheck实现 notifyVRRP选举格式 高可用 介绍 高可用性&#xff08;High Availability&#xff09;是指系统或服务能…

Linux的locale本地化配置

Linux的locale本地化配置 locale简介localectl常用操作语言环境键盘布局 常见问题:配置语言环境报错Linux系统locale(UTF-8)报错最小化自动安装的Centos7修改完整中文显示 locale简介 参考: http://m.blog.chinaunix.net/uid-20621049-id-3427444.html locale把按照所涉及到的…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一&#xff0c;以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript&#xff0c;网站安装ImageMagick&#xff0c;网站 安装完毕后&#xff0c;需要自行配置环境路径 脚本 使用示…

灌区信息化智能测控一体化闸门系统解决方案

一、方案背景 闸门是节水灌溉工程中重要组成部分。在农田灌区中&#xff0c;一方面存在传统手摇闸门&#xff0c;未能实现自动化、数字化&#xff0c;另一方面部分灌区闸站虽然部分实现了自动化控制&#xff0c;但是由于闸站较多&#xff0c;有些位置较为偏僻&#xff0c;部分水…

网络数据安全风险评估实施指引(一)

近日&#xff0c;全国信息安全标准化技术委员会发布了《网络安全标准实践指南 网络数据安全风险评估实施指引》&#xff08;TC260-PG-20231A v1.0-202305&#xff09;&#xff0c;旨在响应《数据安全法》要求&#xff0c;落实重要数据处理过程风险评估&#xff0c;衔接已发布的…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展&#xff0c;使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构&#xff0c;我们能够构建出更强大、可靠且可持续的前…