用Python实现办公自动化(自动化处理Excel工作簿)

自动化处理Excel工作簿

(一)批量生产产品出货清单

以“出货统计表”为例, 需求:将出货记录按照出货日期分类整理成多张出货清单

“出货统计表数据案例”

“产品出货清单模板”

1.提取出货统计表的数据

 “Python程序代码”

# 使用Python第三方模块openpyxl来操控Excel文件
from openpyxl import load_workbook# 1.0 读取工作簿“xxx.xlsx”中的数据
workbook = load_workbook("D:\\pppp\\第6章\\出货统计表.xlsx")
worksheet = workbook["Sheet1"]# 2.0 对工作表中的出货记录按照出货日期进行分类整理,使用字典来组织数据
# 2.1 创建一个空字典data
data = {}
# 2.2 遍历工作表中数据的第2行到最后一行
for row in range(2, worksheet.max_row + 1):date = worksheet["B" + str(row)].value.date()customer = worksheet["C" + str(row)].valueproduct = worksheet["D" + str(row)].valuenumber = worksheet["E" + str(row)].valuemodel = worksheet["G" + str(row)].valueinfo_list = [customer, product, number, model]# 2.3将出货日期作为键,在遍历到具有相同出货日期的出货记录时,不覆盖原来的键(出货日期),而是将其添加到后面的空列表中,形成嵌套列表data.setdefault(date, [])data[date].append(info_list)# 3.0控制台输出字典的键值对,查看运行效果
for key, value in data.items():print(key, value)

“运行效果展示”

2.使用for语句创建产品出货清单

 “Python程序代码”

# 4.0 打开工作簿"出货清单模板.xlsx",并读取其中的工作表"出货清单模板"
workbook_day = load_workbook("D:\\pppp\\第6章\\出货清单模板.xlsx")
worksheet_day = workbook_day["出货清单模板"]# 5.0 按照出货日期遍历字典数据,复制工作表“出货清单模板”并进行重命名,再将出货日期写入出货清单
for date in data.keys():worksheet_new = worksheet_day.copy_worksheet(worksheet_day)worksheet_new.title = str(date)[-5:]worksheet_new.cell(row=2, column=5).value = date# 6.0 从第4行开始逐行填写出货记录i = 4for product in data[date]:worksheet_new.cell(row=i, column=2).value = product[0]worksheet_new.cell(row=i, column=3).value = product[1]worksheet_new.cell(row=i, column=4).value = product[2]worksheet_new.cell(row=i, column=5).value = product[3]i += 1
# 7.0 所有数据填写完毕,另存工作簿
worksheet_day.save("D:\\pppp\\第6章\\产品出货清单.xlsx")

“查看工作簿”

3.完整代码 

# 使用Python第三方模块openpyxl来操控Excel文件
from openpyxl import load_workbook# 1.0 读取工作簿“xxx.xlsx”中的数据
workbook = load_workbook("D:\\pppp\\第6章\\出货统计表.xlsx")
worksheet = workbook["Sheet1"]# 2.0 对工作表中的出货记录按照出货日期进行分类整理,使用字典来组织数据
# 2.1 创建一个空字典data
data = {}
# 2.2 遍历工作表中数据的第2行到最后一行
for row in range(2, worksheet.max_row + 1):date = worksheet["B" + str(row)].value.date()customer = worksheet["C" + str(row)].valueproduct = worksheet["D" + str(row)].valuenumber = worksheet["E" + str(row)].valuemodel = worksheet["G" + str(row)].valueinfo_list = [customer, product, number, model]# 2.3将出货日期作为键,在遍历到具有相同出货日期的出货记录时,不覆盖原来的键(出货日期),而是将其添加到后面的空列表中,形成嵌套列表data.setdefault(date, [])data[date].append(info_list)# 3.0控制台输出字典的键值对,查看运行效果
for key, value in data.items():print(key, value)# 4.0 打开工作簿"出货清单模板.xlsx",并读取其中的工作表"出货清单模板"
workbook_day = load_workbook("D:\\pppp\\第6章\\出货清单模板.xlsx")
worksheet_day = workbook_day["出货清单模板"]# 5.0 按照出货日期遍历字典数据,复制工作表“出货清单模板”并进行重命名,再将出货日期写入出货清单
for date in data.keys():worksheet_new = workbook_day.copy_worksheet(worksheet_day)worksheet_new.title = str(date)[-5:]worksheet_new.cell(row=2, column=5).value = date# 6.0 从第4行开始逐行填写出货记录i = 4for product in data[date]:worksheet_new.cell(row=i, column=2).value = product[0]worksheet_new.cell(row=i, column=3).value = product[1]worksheet_new.cell(row=i, column=4).value = product[2]worksheet_new.cell(row=i, column=5).value = product[3]i += 1
# 7.0 所有数据填写完毕,另存工作簿
workbook_day.save("D:\\pppp\\第6章\\产品出货清单.xlsx")

(二)批量替换工作簿的单元格数据 

 对多个工作簿进行批量单元格数据替换操作。以“月销售统计”为例,将单元格中的数据“背包”替换为“双肩包

 可操控Excel的Python模块很多,例如:

功能XlsxWriter

     xlrd

xlwtxlutilsopenpyxlxlwings
××
×
修改×××
支持xls格式××
支持xlsx格式×
支持批量操作×××××

 “Python程序代码”

"""
将工作簿中的单元格数据替换为其他内容
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块xlwings来操控Excel文件
import xlwings as xw# 1.0 列出文件夹中的所有工作簿,启动Excel程序窗口,并不新建工作簿
src_folder = Path("D:\\pppp\\第6章\\月销售统计\\")
file_list = list(src_folder.glob("*.xlsx"))
# visible用于设置Excel程序窗口的可见性;add_book用于设置启动Excel程序窗口后是否新建工作簿
app = xw.App(visible=False, add_book=False)# 2.0 依次打开列表中的文件。Excel文件打开一个工作簿同时生成一个文件名以“~$”开头的临时文件
for i in file_list:# 跳过这类临时文件if i.name.startswith("~$"):continue# 打开工作不文件workbook = app.books.open(i)# 3.0 批量替换数据# 逐个遍历工作表for j in workbook.sheets:# 以单元格"A2"为起点,从工作表中读取所有数据,存储到变量data中data = j["A2"].expand("table").value# enumerate()是Python的内置函数,用于将一个可遍历的数据对象(如列表、元组、字符串等)组合为一个索引序列,可同时得到数据对象的索引及对应的值# index代表行号(从0开始),而val代表data中的小列表(即一行数据)for index, val in enumerate(data):# 列表中的元素索引是从0开始编号的,要替换的数据位于第3列,即设置2if val[2] == "背包":val[2] = "双肩包"data[index] = val# 将大列表写入工作表,用完成替换的数据覆盖原数据j["A2"].expand("table").value = data# 4.0 使用save()函数保存工作簿workbook.save()# 5.0 使用close()关闭工作簿workbook.close()
# 6.0 使用quit()函数退出Excel程序
app.quit()

“查看运行结果”

(三)将多个工作表合并为一个工作表

将多个工作簿中的同名工作表快速合并为一个工作表,并保存为一个新的工作簿 

1.使用xlwings模块读取多个工作表中的数据

"""
将多个工作簿中的同名工作表快速合并为一个工作表,并保存为一个新的工作簿
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块xlwings来操控Excel文件
import xlwings as xw# 1.0 列出文件夹中的所有工作簿,启动Excel程序窗口,并不新建工作簿
src_folder = Path("D:\\pppp\\第6章\\月销售统计\\")
file_list = list(src_folder.glob("*.xlsx"))
# visible用于设置Excel程序窗口的可见性;add_book用于设置启动Excel程序窗口后是否新建工作簿
app = xw.App(visible=False, add_book=False)# 2.0 依次打开工作簿,读取指定工作表中的数据,并合并在一起
sheet_name = "产品销售统计"
# 用于存放合并数据的列标题。None在Python中表示一个空对象
header = None
all_data = []
for i in file_list:if i.name.startswith("~&"):continueworkbook = app.books.open(i)for j in workbook.sheets:if j.name == sheet_name:if header is None:header = j["A1:I1"].valuedata = j["A2"].expand("table").valueall_data = all_data + data# 3.0 使用close()关闭工作簿workbook.close()

2.新建工作簿存放合并后的数据 

# 4.0 创建一个新的工作簿来存储这些数据
new_workbook = xw.Book()
new_worksheet = new_workbook.sheets.add(sheet_name)
new_worksheet["A1"].value = header
new_worksheet["A2"].value = all_data
# 使用工作表对象函数autofit()自动调整工作表的列宽和行高
new_worksheet.autofit()
new_workbook.save(src_folder / "上半年产品销售统计表.xlsx")
new_workbook.close()# 6.0 使用quit()函数退出Excel程序
app.quit()

 3.完整代码

"""
将多个工作簿中的同名工作表快速合并为一个工作表,并保存为一个新的工作簿
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块xlwings来操控Excel文件
import xlwings as xw# 1.0 列出文件夹中的所有工作簿,启动Excel程序窗口,并不新建工作簿
src_folder = Path("D:\\pppp\\第6章\\月销售统计\\")
file_list = list(src_folder.glob("*.xlsx"))
# visible用于设置Excel程序窗口的可见性;add_book用于设置启动Excel程序窗口后是否新建工作簿
app = xw.App(visible=False, add_book=False)# 2.0 依次打开工作簿,读取指定工作表中的数据,并合并在一起
sheet_name = "产品销售统计"
# 用于存放合并数据的列标题。None在Python中表示一个空对象
header = None
all_data = []
for i in file_list:if i.name.startswith("~&"):continueworkbook = app.books.open(i)for j in workbook.sheets:if j.name == sheet_name:if header is None:header = j["A1:I1"].valuedata = j["A2"].expand("table").valueall_data = all_data + data# 3.0 使用close()关闭工作簿workbook.close()# 4.0 创建一个新的工作簿来存储这些数据
new_workbook = xw.Book()
new_worksheet = new_workbook.sheets.add(sheet_name)
new_worksheet["A1"].value = header
new_worksheet["A2"].value = all_data
# 使用工作表对象函数autofit()自动调整工作表的列宽和行高
new_worksheet.autofit()
new_workbook.save(src_folder / "上半年产品销售统计表.xlsx")
new_workbook.close()# 6.0 使用quit()函数退出Excel程序
app.quit()

(四)将一个工作表拆分为多个工作簿

 Eg:以工作簿“产品统计表.xlsx”中的工作表"统计表"为例

“Python程序代码”

"""
将一个工作表拆分为多个工作簿。
需求:按照产品名称将工作表中的数据分类整理到不同的工作簿中。
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块xlwings来操控Excel文件
import xlwings as xw# 1.O 设置相关的文件和文件夹路径
src_file = Path("D:\\pppp\\第6章\\产品统计表.xlsx")
des_folder = Path("D:\\pppp\\第6章\\拆分后的产品统计表\\")
if not des_folder.exists():des_folder.mkdir(parents=True)# 2.0 打开工作簿,读取工作表中的数据
app = xw.App(visible=False, add_book=False)
workbook = app.books.open(src_file)
worksheet = workbook.sheets["统计表"]
header = worksheet["A1:H1"].value
data1 = worksheet.range("A2").expand("table").value# 3.0 按照产品名称对读取的数据进行分类
# 创建一个空字典data2
data2 = dict()
# 设置循环次数,即读取数据的行数
for i in range(len(data1)):# 产品名称位于整个数据的第2列product_name = data1[i][1]if product_name not in data2:data2[product_name] = []data2[product_name].append(data1[i])# 4.0新建工作簿,保存分类后的数据
for k, v in data2.items():new_workbook = app.books.add()new_worksheet = new_workbook.sheets.add(k)new_worksheet["A1"].value = headernew_worksheet["A2"].value = vnew_worksheet.autofit()new_workbook.save(des_folder / f"{k}.xlsx")new_workbook.close()# 5.0 使用quit()函数退出Excel程序
app.quit()

“运行结果展示”

(五)批量拆分列数据

 

(六)批量分类汇总数据

 

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

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

相关文章

安全SCDN的威胁情报库对DDOS防护有什么好处

目前网络攻击事件频频发生,DDoS(分布式拒绝服务)攻击已成为各种企业(小到区域性小公司大到各种跨国公司)的主要威胁,DDoS 攻击可能会对企业造成重大损害和破坏,比如对目标公司的业务造成产生不利…

C#使用SQLite(含加密)保姆级教程

C#使用SQLite 文章目录 C#使用SQLite涉及框架及库复制runtimes创建加密SQLite文件生成连接字串执行SQL生成表SQLiteConnectionFactory.cs 代码结构最后 涉及框架及库 自己在NuGet管理器里面安装即可 Chloe.SQLite:ORM框架Microsoft.Data.Sqlite.Core:驱…

React Native框架开发APP,安装免费的图标库(react-native-vector-icons)并使用详解

一、安装图标库 要使用免费的图标库,你可以使用 React Native Vector Icons 库。 首先,确保你已经安装了 react-native-vector-icons: npm install --save react-native-vector-iconsnpm install --save-dev types/react-native-vector-ic…

并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)

CountDownLatch 倒计时锁存器 用来解决线程执行次序的问题 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), 当计数器的值变为…

云服务器8核32G配置租用优惠价格94元/月、1362元一年

8核32G云服务器京东云轻量云主机价格94元1个月、282元3个月、673元6个月、1362元一年,配置8C32G-100G SSD系统盘-10M带宽-2000G月流量 华北-北京,京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图: 8核32G云服务器京东云轻量云主机价…

CSS(三)---【盒子模型、边框、外边距合并】

零.前言 本篇主要介绍CSS中最重要的一种概念模型:“盒子模型”。 关于CSS的更多内容,可以查看作者之前的文章: CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 CSS(二)---【常见属性、复合属性使用】-CSDN博客 一.盒子模…

WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具

关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具,该工具能够枚举目标域名下的子域名,并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…

Jamba:AI21 实验室发布首个应用级的 Mamba 架构 AI 模型

AI21 实验室发布了 Jamba,这是全球首个基于 Mamba 架构的、可用于实际应用的 AI 模型。目前大多数模型(例如 GPT、Gemini 和 Llama)都基于 Transformer 架构。Jamba 结合了 Mamba 结构化状态空间模型 (SSM) 和传统 Transformer 架构的优点&am…

属性选择器

1.[title]{background:yellow;}:所有带title标签设置成黄色 2.div[class]{background:yellow;}:所有div中带class标签设置成黄色 3.div[classbox1]{border:1px solid blue; }:div中包含class并且classbox1的设置成蓝边框 4. class…

Postman Tests设置Global读取不是最新值,跟Tests执行顺序有关(踩坑笔记)

前言 在执行Run Collection的时候,发现设置的全局变量每次读取都是旧值,没有读取到最新的值。 背景 有2个地方需要动态参数,一个URL,一个Body,因此需要设置Tests脚本。 url动态参数 url:动态参数projec…

【Java】打包:JAR、EAR、WAR

打包:JAR、EAR、WAR war 是一个 Web 模块,其中需要包括 WEB-INF,是可以直接运行的 WEB 模块。而 jar 一般只是包括一些 class 文件,在声明了 main_class 之后是可以用 java 命令运行的。 它们都是压缩的包,拿 Tomcat …

【基于springboot分析Quartz(v2.3.2)的启动流程】

基于springboot分析Quartz(v2.3.2)的启动流程 最近公司的定时任务使用了Quartz框架,在开发中经常出现定任务不执行了的问题,但是我又找不到原因所在,可把我愁坏了。于是我决定看看Quartz框架是怎么调度任务的。&#x…

C# wpf 实现底部嵌入HwndHost

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 底部嵌入HwndHost(本章) 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现?1、底部创建窗口(1)、创建透明窗口&…

FebHost:什么是哈萨克斯坦.KZ域名?

哈萨克斯坦,作为中亚地区重要的一员,其国家域名”.kz”正成为这个独立国家在网络世界中的代表。作为一个经济快速发展的国家,哈萨克斯坦的互联网基础设施和网络应用也在蓬勃发展。而.kz域名正是哈萨克斯坦网络身份的重要体现。 作为注册和管理.kz域名的主要机构,哈…

2020年30米二级分类北京市土地利用数据

引言 北京市省土地利用数据产品是指基于Landsat TM/ETM/OLI遥感影像,采用遥感信息提取方法,并结合野外实测,以及参照国内外现有的土地利用/土地覆盖分类体系,经过波段选择及融合,图像几何校正及配准并对图像进行增强处…

Elasticsearch 开放 inference API 增加了对 Cohere Embeddings 的支持

作者:来自 Elastic Serena Chou, Jonathan Buttner, Dave Kyle 我们很高兴地宣布 Elasticsearch 现在支持 Cohere 嵌入! 发布此功能是与 Cohere 团队合作的一次伟大旅程,未来还会有更多合作。 Cohere 是生成式 AI 领域令人兴奋的创新者&…

SpringBoot+Prometheus+Grafana实现应用监控和报警

一、背景 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是目前比较常用的方案之一。它们三者之间的关系大概如下图&#xff1a; 关系图 二、开发SpringBoot应用 首先&#xff0c;创建一个SpringBoot项目&#xff0c;pom文件如下&#xff1a; <…

蓝桥杯嵌入式老竞赛板在MDK5上使用CooCox下载出现unknown device的问题

本文是在参考网上博客并经过实操解决自己遇到的问题总结而成&#xff0c;只是为了让后来者少走弯路。 本文是在在LED闪烁实验时遇到这个问题 蓝桥杯嵌入式老竞赛板在MDK5上使用CooCox下载出现unknown device的问题 环境&#xff1a;win11系统&#xff0c;keil MDK 518 老竞赛…

【Unity】TextMeshPro富文本

启用富文本 在Unity里&#xff0c;如果需要使用富文本&#xff0c;首先需要开启Rich Text 如果不开启Rich Text&#xff0c;就会在UI上显示富文本代码 1.粗体 <b>Game</b> Over2.斜体 <i>Game</i> Over3.下划线 <u>Game</u> Over4…

.Net 知识杂记

记录平日中琐碎的.net 知识点。不定期更新 目标框架名称(TFM) 我们创建C#应用程序时&#xff0c;在项目的工程文件(*.csproj)中都有targetFramework标签&#xff0c;以表示项目使用的目标框架 各种版本的TFM .NET Framework .NET Standard .NET5 及更高版本 UMP等 参考文档&a…