使用Python轻松玩转Excel工作表:添加与删除实战指南

简介: 本文以轻松对话形式,介绍如何用Python(openpyxl库)高效批量处理Excel:三行代码添加/删除工作表,一个循环搞定二十多个文件;附避坑指南与实战工具,助办公族告别重复操作,提升效率。(239字)


早上九点,我刚打开电脑,同事小张就抱着一摞Excel文件冲了过来。

“帮帮忙,我这二十多个Excel文件,每个里面都要加一个汇总工作表,还要把那个旧的测试表删掉。我一个一个手动操作,弄到明年也弄不完啊。”

我看了看他那生无可恋的表情,笑了笑说:“别急,Python几行代码就搞定了。”

小张一脸怀疑:“Python还能干这个?”
代理 IP 使用小技巧 让你的数据抓取效率翻倍 (42).png

当然能。而且比你想象的要简单得多。

准备工作:装个库就行
要用Python操作Excel,我们需要一个叫openpyxl的库。它就像是一个翻译官,让Python能听懂Excel说的话。

打开命令行,输入这一行:

pip install openpyxl

如果你用的是Jupyter Notebook或者Anaconda,也可以用:

conda install openpyxl

装好了之后,我们就可以开始玩了。

第一个例子:打开一个Excel文件
假设我们有一个叫“销售数据.xlsx”的文件,里面已经有一些工作表了。

from openpyxl import load_workbook

加载Excel文件

wb = load_workbook('销售数据.xlsx')

看看里面有哪些工作表

print(wb.sheetnames)

运行这段代码,你会看到类似这样的输出:

['一月销售', '二月销售', '三月销售', '旧数据_不要动']

好了,现在我们能看到这个Excel文件里到底藏了几个工作表。

添加新工作表:真的就一行代码
小张的第一个需求是加一个汇总表。怎么做呢?

在最后面添加一个叫“季度汇总”的工作表

wb.create_sheet('季度汇总')

保存文件

wb.save('销售数据.xlsx')

就这么简单。create_sheet这个方法就是用来创建新工作表的。

如果你想把这个新工作表放在最前面,可以这样写:

在第一个位置插入新工作表

wb.create_sheet('季度汇总', 0)

那个0表示位置索引。0就是第一个,1就是第二个,依此类推。

小张看完这段代码,瞪大了眼睛:“就这?我手动点半天,你一行代码就搞定了?”

我点点头:“Python就是干这个用的。”

删除工作表:同样简单
小张的第二个需求是删掉那个叫“旧数据_不要动”的工作表。

删除操作也很直接:

获取要删除的工作表

oldsheet = wb['旧数据不要动']

删除它

wb.remove(old_sheet)

保存

wb.save('销售数据.xlsx')

注意一个坑:删除工作表之后,一定要记得保存。不保存的话,原文件不会发生任何变化。

还有一个更简洁的写法:

一行搞定

wb.remove(wb['旧数据_不要动'])
wb.save('销售数据.xlsx')
小张看到这里,已经开始兴奋了:“那我要处理二十多个文件,是不是写个循环就行了?”

“聪明。”

批量处理:让电脑帮你干活
小张的实际情况是:一个文件夹里有二十多个Excel文件,每个都要做同样的操作——添加“汇总”表,删除“临时”表。

我们写个循环来解决:

import os
from openpyxl import load_workbook

存放Excel文件的文件夹路径

folder_path = 'C:/销售数据/'

遍历文件夹里所有的文件

for filename in os.listdir(folder_path):
if filename.endswith('.xlsx'): # 只处理Excel文件
file_path = os.path.join(folder_path, filename)

    # 打开文件
    wb = load_workbook(file_path)

    # 添加汇总表(如果还没有的话)
    if '汇总' not in wb.sheetnames:
        wb.create_sheet('汇总')

    # 删除临时表(如果存在的话)
    if '临时' in wb.sheetnames:
        wb.remove(wb['临时'])

    # 保存修改
    wb.save(file_path)
    print(f'处理完成:{filename}')

print('全部搞定!')

跑完这个脚本,小张那二十多个文件就全部处理好了。他只需要去泡杯咖啡,回来就能看到结果。

避坑指南:新手最容易踩的五个坑
坑一:忘记保存
这是最常见的问题。代码写完了,运行也没报错,但打开Excel一看,什么都没变。

原因很简单:忘了写wb.save()。

记住一个原则:load_workbook只是把文件读到内存里,所有修改都只是在内存中。只有执行save,才会真正写回硬盘。

坑二:删除不存在的工作表
如果你试图删除一个不存在的工作表,Python会直接报错。

这样写,如果工作表不存在就会报错

wb.remove(wb['不存在的表']) # 报错!

安全的写法是先判断一下:

if '不存在的表' in wb.sheetnames:
wb.remove(wb['不存在的表'])

坑三:工作表名字不能重复
Excel不允许同一个文件里有重名的工作表。如果你尝试创建两个同名的表,Python会报错。

wb.create_sheet('汇总')
wb.create_sheet('汇总') # 报错!名字重复了

要么先检查是否存在:

if '汇总' not in wb.sheetnames:
wb.create_sheet('汇总')

要么换个名字:

wb.create_sheet('汇总_v2')

坑四:文件被占用
如果你在运行Python脚本的时候,Excel文件正被其他程序(比如你手动打开的Excel)打开着,Python就没法写入。

解决方法:关掉那个文件,或者换个没被占用的文件。

坑五:openpyxl不支持.xls文件
openpyxl只能处理.xlsx格式的文件。如果你遇到老旧的.xls文件,需要用另一个库叫xlrd和xlwt。

如果实在需要处理.xls文件,最简单的办法是先用Excel把它另存为.xlsx格式。

玩点高级的:添加带数据的工作表
光添加一个空表可能还不够。有时候我们想在新表里填上一些数据,比如汇总统计。

来看个例子:把所有月份的数据汇总到一个新表里。

from openpyxl import load_workbook

wb = load_workbook('销售数据.xlsx')

创建汇总表

summary_sheet = wb.create_sheet('自动汇总')

写个标题

summary_sheet['A1'] = '月份'
summary_sheet['B1'] = '总销售额'

从各个月份的表里收集数据

row_num = 2
for month in ['一月销售', '二月销售', '三月销售']:
if month in wb.sheetnames:
month_sheet = wb[month]

    # 假设每个月的表里,B列是销售额,从第2行到第10行
    total = 0
    for row in range(2, 11):
        cell_value = month_sheet.cell(row, 2).value
        if cell_value and isinstance(cell_value, (int, float)):
            total += cell_value

    # 写入汇总表
    summary_sheet.cell(row_num, 1, month)
    summary_sheet.cell(row_num, 2, total)
    row_num += 1

wb.save('销售数据_带汇总.xlsx')

这样跑完之后,新生成的Excel文件里就多了一个“自动汇总”表,里面整整齐齐地列着每个月的总销售额。

更优雅的写法:使用with语句
每次都要手动save,有时候会忘记。Python提供了一个更优雅的写法,叫做上下文管理器。不过openpyxl本身不直接支持,我们可以自己封装一下:

from openpyxl import load_workbook

def process_excel(file_path):
wb = load_workbook(file_path)

# 在这里做各种操作
wb.create_sheet('新表')
# 自动保存
wb.save(file_path)

process_excel('我的文件.xlsx')

把操作写成一个函数,调用完自动保存,这样就不容易忘了。

实战小项目:清理Excel工具箱
最后,我们来做一个实用的小工具。它可以:

import os
from openpyxl import load_workbook

def clean_and_add_catalog(folder_path):
for filename in os.listdir(folder_path):
if not filename.endswith('.xlsx'):
continue

    file_path = os.path.join(folder_path, filename)
    print(f'正在处理:{filename}')

    wb = load_workbook(file_path)

    # 找出所有带“备份”的工作表并删除
    sheets_to_delete = [s for s in wb.sheetnames if '备份' in s]
    for sheet_name in sheets_to_delete:
        wb.remove(wb[sheet_name])
        print(f'  已删除:{sheet_name}')

    # 在第一个位置创建目录表
    catalog = wb.create_sheet('目录', 0)
    catalog['A1'] = '工作表目录'
    catalog['A2'] = '序号'
    catalog['B2'] = '工作表名称'

    # 列出所有剩余的工作表
    for idx, sheet_name in enumerate(wb.sheetnames[1:], start=1):  # 跳过目录表自己
        catalog.cell(idx + 2, 1, idx)
        catalog.cell(idx + 2, 2, sheet_name)

    wb.save(file_path)
    print(f'  完成!剩余工作表:{wb.sheetnames[1:]}\n')

使用

clean_and_add_catalog('C:/我的Excel文件/')

这个工具跑完,每个文件都会变得更干净、更好用。

总结一下(别担心,很短)
Python操作Excel工作表,核心就三个动作:

会了这三个,再加上一个循环,就能处理成百上千个文件。

小张后来请我喝了杯咖啡。他说:“早知道Python这么方便,我过去那些加班的晚上都白费了。”

我说:“没事,现在开始用,以后就不用加班了。”

他笑了笑,回去继续写他的Python脚本去了。这次不是为了加班,而是为了早点下班。

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32698 79
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17751 20
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36682 19
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24758 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36660 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29838 52

热门文章

最新文章

下一篇
开通oss服务