用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替换成图片 的相关文章

  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何使用命令行压缩文件?

    我想使用批处理文件命令 Windows XP 批处理文件 压缩目录 例如 如果我想解压缩一个文件意味着我可以使用jar xf file zip java bat 文件命令 就像我想要一个命令行批处理来压缩目录一样 如果您使用的是 Ubunt
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • 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减轻一下负