用python对excel进行批量处理(1):将表格中的url用requests替换成图片

2023-10-28

前言

事情是这样的,npy说今天的工作里有一个900个项目的excel,表格的样子大概如下图所示。需求呢是将下图中的url全部替换成对应的图片添加到excel中。 作为一个程序员,这样的任务要是手动做真是太难为人了。 所以打算帮npy减轻一下负担。
在这里插入图片描述
一开始我搜excel的python处理都是给我推荐xlrd包,但是这个包只能读取不能写入。然后继续搜搜到了xlwt, 但是它又只能写入不能修改。最后找到了openpyxl这个包。

处理

不想写心路历程了, 总之就是request下载图片,openpyxl添加图片, 以及对于excel中合并单元格的一些处理。
因为感觉以后npy可能还会有这样的活,所以花了一晚上造了一点轮子,在博客上存一手代码,准备下次再用。

from openpyxl import *
from openpyxl.drawing.image import Image
from openpyxl.cell import MergedCell
from openpyxl.drawing.spreadsheet_drawing import OneCellAnchor, AnchorMarker
from openpyxl.utils.units import pixels_to_EMU, cm_to_EMU
from openpyxl.drawing.xdr import XDRPoint2D, XDRPositiveSize2D

from io import BytesIO
import requests
from tqdm import tqdm
import traceback


class ExcelOp(object):
    def __init__(self, file, sheet_name="Sheet1"):
        self.file = file
        self.wb = load_workbook(self.file)
        self.ws = self.wb[sheet_name]
        # self.max_rows, self.max_cols = self.ws.max_row, self.ws.max_column

    # 获取某个单元格的值
    def get_cell_value(self, row, column):
        cell = self._parser_merged_cell(row, column)
        cell_value = cell.value
        return cell_value

    # 获取某列的所有值
    def get_col_value(self, column):
        rows = self.ws.max_row
        column_data = []
        for i in range(1, rows + 1):
            cell_value = self.get_cell_value(row=i, column=column)
            column_data.append(cell_value)
        return column_data

    # 获取某行所有值
    def get_row_value(self, row):
        columns = self.ws.max_column
        row_data = []
        for i in range(1, columns + 1):
            cell_value = self.get_cell_value(row=row, column=i)
            row_data.append(cell_value)
        return row_data

    # 设置某个单元格的值
    def set_cell_value(self, row, colunm, cellvalue):
        cell = self._parser_merged_cell(row, colunm)
        try:
            cell.value = cellvalue
        except:
            cell.value = "ERROR:writefail"

    # 在某个单元格上添加一张图
    def set_image(self, fp: BytesIO, row: int, column: int, img_pixel_height=None, img_pixel_width=None):
        cell = self._parser_merged_cell(row, column)
        image_data = Image(fp)
        w = image_data.width if img_pixel_width is None else img_pixel_width
        h = image_data.height if img_pixel_height is None else img_pixel_height
        size = XDRPositiveSize2D(pixels_to_EMU(w), pixels_to_EMU(h))
        # https://stackoverflow.com/questions/55309671/more-precise-image-placement-possible-with-openpyxl-pixel-coordinates-instead
        # AnchorMarker 它的row和col 又从0开始数了 好烦
        marker = AnchorMarker(col=cell.column-1, row=cell.row-1)
        image_data.anchor = OneCellAnchor(_from=marker, ext=size)
        # image_data.anchor = "A1"
        self.ws.add_image(image_data)

    def _parser_merged_cell(self, row, col):
        """
        检查是否为合并单元格并获取对应行列单元格的值。
        如果是合并单元格,则取合并区域左上角单元格的值作为当前单元格的值,否则直接返回该单元格的值
        :param sheet: 当前工作表对象
        :param row: 需要获取的单元格所在行
        :param col: 需要获取的单元格所在列
        :return: 
        """
        cell = self.ws.cell(row=row, column=col)
        if isinstance(cell, MergedCell):  # 判断该单元格是否为合并单元格
            for merged_range in self.ws.merged_cells.ranges:  # 循环查找该单元格所属的合并区域
                if cell.coordinate in merged_range:
                    # 获取合并区域左上角的单元格作为该单元格的值返回
                    cell = self.ws.cell(
                        row=merged_range.min_row, column=merged_range.min_col)
                    break
        return cell


if __name__ == "__main__":
    excel = ExcelOp(file="./1.xlsx")
    excel.ws.column_dimensions['G'].width = 65  # 设置单元格宽
    urls = excel.get_col_value(7)  # excel行和列都是从1开始数  7对应G
    try:
        for row, url in tqdm(enumerate(urls[1:])):
            row = row+2  # python从0开始数  excel从1开始  且excel第一行是title 所以加2
            if url.endswith('_30x30.jpg'):
                url = url[0:-10]
            excel.ws.row_dimensions[row].height = 250  # 设置单元格高
            excel.set_cell_value(row, 7, '')  # 删除原有的url
            r = requests.get(url=url, headers={"user-agent": "Mozilla/5.0"})
            if r.status_code != 200:
                print(r.status_code, " in line ", row)
            # 文件操作open()的返回值就是BytesIO 或 StringIO
            excel.set_image(BytesIO(r.content), row, 7, 305.5, 405.8)
    except:
        print(traceback.format_exc())
        excel.wb.save("2_witherror.xlsx")
    excel.wb.save("2.xlsx")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用python对excel进行批量处理(1):将表格中的url用requests替换成图片 的相关文章

  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • linux下查看进程的位置

    在linux下使用top命令可以查看进程 但是单从文件名无法定位到进程的位置 有如下两种方法 1 获取进程的pid 然后使用命令ls l proc pid 这个命令可以列出该进程的启动位置 2 usr sbin lsof grep 进程名称
  • redis集群搭建(6节点单实例)

    1 分布式缓存的搭建 地址与服务器规划 Master1 192 168 232 128 slaver1 192 168 232 131 Master2 192 168 232 129 slaver2 192 168 232 132 Mast
  • Python中类的访问限制

    学习要点 在Python中 类的访问限制可以通过使用单下划线 和双下划线 进行控制 但这并不是严格的访问控制 而是一种命名约定 单下划线 约定性私有 一个下划线前缀表示一个属性或方法应该被视为 内部 使用 这只是一种约定 并没有严格的强制规
  • 数据库试题

    1 单选题 下列关于关系型数据库说法错误的是 A 使用键值对存储数据 B 关系型数据库 是指采用了关系模型来组织数据的数据库 C 关系型数据库的最大特点就是事务的一致性 D 关系型数据库的不足 大量数据的操作 字段的不固定 对表的索引以及表
  • 分支与循环语句_C语言入门

    目录 2 分支语句 什么是分支语句 2 1 if 语句 2 1 1 单分支 2 1 2 双分支 2 1 3 多分支 2 2 switch 选择结构 2 2 2 default 子句 3 循环语句 3 1for 循环 3 1 1 for循环的
  • Tomcat 详解(安装Tomcat、启动和配置,发布一个web网站)

    接下来开始 Tomcat DE 详细介绍 文章目录 一 安装Tomcat 二 Tomcat 启动和配置 2 1 目录文件 2 2 启动 Tomcat 测试 2 3 关闭 Tomcat 三 配置 四 发布一个 web 网站 五 常见面试题 一
  • Android系统之Bundle用法

    1 Bundle概述 Bundle在Android开发中非常常见 它的作用主要时用于传递数据 Bundle传递的数据包括 string int boolean byte float long double等基本类型或它们对应的数组 也可以是
  • springboot项目maven老是加载不了jar包如SpringBootApplication找不到

    困扰我好久了所以开贴记录一下 解决办法 我是清理了一些里面的杂乱的项目 就好了 具体的原因不太清楚 不过 应该事其他的项目造成的干扰 导致项目不能加载 以上方法不知道所以 下面方法可以尝试 在Maven命令后加入参数 Dmaven wago
  • 华为OD机试真题-静态代码扫描服务【2023Q1】【JAVA、Python、C++】

    题目描述 静态扫描快速快速识别源代码的缺陷 静态扫描的结果以扫描报告作为输出 1 文件扫描的成本和文件大小相关 如果文件大小为N 则扫描成本为N个金币 2 扫描报告的缓存成本和文件大小无关 每缓存一个报告需要M个金币 3 扫描报告缓存后 后
  • StringUtils详细介绍

    转自 https www oschina net code snippet 239959 8724 commentform public static void TestStr null 和 操作 判断是否Null 或者 System ou
  • 【Shell牛客刷题系列】SHELL16 判断输入的是否为IP地址:来练习正则表达式~

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Linux 欢迎关注专栏 本文知识预告 本文首先结合之前正则表达式的相关知识 给出了IP地
  • 苹果ipcc下载

    http ax phobos apple com edgesuite net WebObjects MZStore woa wa com apple jingle appserver client MZITunesClientCheck v
  • 飞桨学习笔记之经典图像分类模型

    1 LeNet 2 AlexNet 3 VGG 4 GoogLeNet 5 ResNet 1 LeNet LeNet 通过连续使用卷积和池化层的组合提取图像特征 网络结构示意图 第一模块 包含5 5的6通道卷积和2 2的池化 卷积提取图像中
  • request_time和upstream_response_time详解

    下图是request time 下图是upstream response time 精准的描述就是 request time是从接收到客户端的第一个字节开始 到把所有的响应数据都发送完为止 upstream response time是从与
  • CTK系列之编译

    CTK编译 CTK编译笔记 资源下载 CTK 源码下载 master ctk github 链接 cmake环境准备 下载最新版本cmake的window安装包直接安装即可 camke下载链接 编译前准备 以本次安装为例 安装目录选择实在C
  • 考研复试数据库原理课后习题(十五)——数据仓库和联机分析处理技术

    数据仓库和联机分析处理技术 1 数据仓库的4个基本特征是什么 数据仓库的4个基本特征如下 数据仓库的数据是面向主题的 主题是一个抽象的概念 是在较高层次上将企业信息系统中的数据综合 归类并进行分析利用的抽象 面向主题的数据组织方式是根据分析
  • Python执行windows命令,报中文乱码解决方法

    笔者通过subprocess模块在windows机器上执行ping 服务器命令 结果报如下错误 Ping hostname 在这里可以用python的第三发插件chardet来探测一下原有字符是什么编码 如果没有安装 可以用命令 pip i
  • 闻达(wenda+chatGLM-6B)一键部署包

    本文是 基于闻达 wenda chatGLM 6B 构建自己的知识库小助手 的一键部署包 将处理数据 模型启动整理为 可执行脚本 并提供内置python虚拟环境 无需任何额外的环境配置 只需要上传自己的知识库文件即可使用 部署包链接 链接
  • 硬件系统工程师宝典(14)-----建议收藏!常用的多层板叠层结构“大揭秘”

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们说到PCB的布局可根据功能 频率 信号类型划分 布局时考虑敏感信号远离噪声源 今天我们来看看多层板的常用叠层结构 四层板的叠层结构 四层板的叠层
  • 用python对excel进行批量处理(1):将表格中的url用requests替换成图片

    前言 事情是这样的 npy说今天的工作里有一个900个项目的excel 表格的样子大概如下图所示 需求呢是将下图中的url全部替换成对应的图片添加到excel中 作为一个程序员 这样的任务要是手动做真是太难为人了 所以打算帮npy减轻一下负