用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)].value
    product = worksheet["D" + str(row)].value
    number = worksheet["E" + str(row)].value
    model = worksheet["G" + str(row)].value
    info_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 = 4
    for 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)].value
    product = worksheet["D" + str(row)].value
    number = worksheet["E" + str(row)].value
    model = worksheet["G" + str(row)].value
    info_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 = 4
    for 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列,即设置2
            if 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("~&"):
        continue
    workbook = app.books.open(i)
    for j in workbook.sheets:
        if j.name == sheet_name:
            if header is None:
                header = j["A1:I1"].value
        data = j["A2"].expand("table").value
        all_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("~&"):
        continue
    workbook = app.books.open(i)
    for j in workbook.sheets:
        if j.name == sheet_name:
            if header is None:
                header = j["A1:I1"].value
        data = j["A2"].expand("table").value
        all_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 = header
    new_worksheet["A2"].value = v
    new_worksheet.autofit()
    new_workbook.save(des_folder / f"{k}.xlsx")
    new_workbook.close()

# 5.0 使用quit()函数退出Excel程序
app.quit()

“运行结果展示”

(五)批量拆分列数据

 

(六)批量分类汇总数据

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全入门 5 天速成教程_ WEB 安全渗透攻防技术

前言 随着 Web 技术发展越来越成熟,而非 Web 服务越来越少的暴露在互联网上,现在互联网安全主要指的是 Web 安全。 为了自身不“裸奔”在大数据里,渐渐开始学习 Web 安全,在学习 Web 安全的过程中,发现很大一部分知识…

分文件编程——Makefile

1.分文件编程 1.1源文件&#xff1a; .c结尾的文件 包含main函数的.c 包含子函数的.c 1.2头文件&#xff1a; .h结尾的文件 文件包含 头文件、宏定义、typedef、结构体、共用体、枚举、函数声明… 调用时用#include"xx.h" #include< >与#include " &q…

对DataFrame中的缺失值采用插值实现缺失值处理interpolate()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对DataFrame中的缺失值 采用插值实现缺失值处理 interpolate() [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd a pd.DataFrame({ A: [1, 2, None, 4, 5], …

数字乡村发展之路:探索农村智慧化新模式

一、引言 随着信息技术的迅猛发展和普及&#xff0c;数字化已经成为推动乡村发展的重要引擎。数字乡村建设旨在通过信息化、智能化手段&#xff0c;提升农村地区的生产生活水平&#xff0c;推动农村经济社会的转型升级。本文旨在探讨数字乡村的发展之路&#xff0c;分析农村智…

基于java+springboot+vue实现的电商个性化推荐系统(文末源码+Lw+ppt)23-389

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对电商个性化推荐进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套电商个性化推荐系统&#xff0c;帮…

Docker镜像逆向生成Dockerfile

你是否曾经遇到过一个想要使用的 Docker 镜像&#xff0c;但却无法修改以适应你的特定需求&#xff1f;或者你可能发现了一个喜欢的 Docker 镜像&#xff0c;但想要了解它是如何构建的&#xff1f;在这两种情况下&#xff0c;将 Docker 镜像逆向生成一个 Dockerfile 可以使用一…

【电子取证篇】哈希校验值的变与不变

【电子取证篇】哈希校验值的变与不变 哈希值&#xff08;散列值&#xff09;是针对电子数据内容来计算的&#xff0c;内容变则哈希变&#xff1b;但计算对象的文件名、文件时间等属性改变不会影响散列值&#xff01;&#xff01;&#xff01;—【蘇小沐】 &#xff08;一&…

HarmonyOS实战开发-如何实现一个简单的电子相册应用开发

介绍 本篇Codelab介绍了如何实现一个简单的电子相册应用的开发&#xff0c;主要功能包括&#xff1a; 实现首页顶部的轮播效果。实现页面跳转时共享元素的转场动画效果。实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 Swiper&#xff1a;滑块视图容…

【C++】多态的原理

目录 一、虚函数表 1、虚函数表的定义 2、虚函数表特性 3、虚表的打印 二、多态的原理 三、多态的相关问题 1、指针偏移问题 2、输出的程序是什么&#xff1f; 3、输出的程序是什么&#xff1f; 【前言】 上一篇我们学习了多态的基础知识&#xff0c;这一篇我将带着大…

vivado 生成比特流或器件镜像

在生成比特流或器件镜像之前 &#xff0c; 请复查其设置 &#xff0c; 确保这些设置对于您的设计都正确无误 &#xff0c; 这一点至关重要。 Vivado IDE 中的比特流和器件镜像设置分为 2 种类型 &#xff1a; 1. 比特流或器件镜像文件格式设置。 2. 器件配置设置。 在 V…

大数据-hive,初步了解

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性&#xff0c;因此使用Hive构建的数据仓库也秉承了这些特性。 简单来说&#xff0c;Hive就是在Hadoop上架了一层SQL接口&#xff0c;可以将SQL翻译成MapRedu…

java题目9:100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。计算大中小马的数目(HorsesPackGoods9)

每日小语 正是他的意图损坏了他的悟性。——《充足理由律的四重根》 思考 有点鸡兔同笼的感觉嗷&#xff0c; //100匹马驮100担货&#xff0c;大马一匹驮3担&#xff0c;中马一匹驮2担&#xff0c;小马两匹驮1担。计算大中小马的数目&#xff08;public class HorsesPackGoo…

Centos7安装RTL8111网卡驱动

方法一&#xff1a; // 安装pciutils # yum install -y pciutils // 查看pci设备信息 # lspci | grep -i Ethernet 09:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 03) // 上面看到是Re…

使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳推荐的材料和工艺流程?

对于使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳&#xff0c;以下是一些推荐的材料和工艺流程&#xff1a; 材料&#xff1a; UV树脂胶液&#xff1a;选择适合倒模工艺的UV树脂胶液&#xff0c;要求具有高透明度、良好的流动性和固化性能。模具材料&#xff1a;根据…

RWKV_Pytorch:支持多硬件适配的开源大语言模型推理框架

亲爱的技术探索者们&#xff0c;今天我要向大家隆重推荐一个在开源社区中崭露头角的项目——RWKV_Pytorch。这是一个基于Pytorch的RWKV大语言模型推理框架&#xff0c;它不仅具备高效的原生Pytorch实现&#xff0c;而且还扩展了对多种硬件的适配支持&#xff0c;让模型的部署和…

JUC/多线程 模式(四)

一、同步模式之保护性暂停 即 Guarded Suspension &#xff0c;用在一个线程等待另一个线程的执行结果 产生结果的线程和使用结果的线程是一一对应的&#xff0c;有多少个生产结果的线程就有多少个使用结果的线程。 要点 有一个结果需要从一个线程传递到另一个线程&#xff0…

C#_事件_多线程(基础)

文章目录 事件通过事件使用委托 多线程(基础)进程:线程: 多线程线程生命周期主线程Thread 类中的属性和方法创建线程管理线程销毁线程 事件 事件&#xff08;Event&#xff09;本质上来讲是一种特殊的多播委托&#xff0c;只能从声明它的类中进行调用,基本上说是一个用户操作&…

什么样的人适合学习网络安全?怎么学?_

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a;什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 会产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级学科&#xff0c;…

Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序

Pandas操作MultiIndex合并行列的excel&#xff0c;写入读取以及写入多余行及Index列处理&#xff0c;多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex&#xff0c;写的糊糊涂涂&#xff0c;晕晕乎乎。 是我呀… 记录下&#…

互联网轻量级框架整合之JavaEE基础

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…