Python办公自动化(3)对Excel的操作

1.读取excel文件

1.安装工具

终端下载读取excel文档的工具库:

 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd

若对版本有特殊需求: 

删除当前版本:pip3 uninstall xlrd

下载所需要的版本:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd==1.2.0

2.打开目录中的excel文件

import xlrd
excel = xlrd.open_workbook('question.xlsx')
print(excel)

3.搜索excel文件页签

import xlrd
excel = xlrd.open_workbook('question.xlsx')
# 根据页签名找到页签
book1 = excel.sheet_by_name('题库')
print(book1.name)
# 获取第一个页签
book2 = excel.sheet_by_index(0)
print(book2.name)
# 遍历所有页签
for i in excel.sheets():print(i.name)

4. 获得表格中的数据

import xlrd
excel = xlrd.open_workbook('question.xlsx')
book = excel.sheet_by_name('题库')
for i in book.get_rows():content = []for j in i:content.append(j.value)print(content)

2.新建excel文件

1.安装工具

终端下载创建excel文档的工具库(支持写入文本、数字、公式等):

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlsxwriter

2.创建excel文档

import xlsxwriter
# 生成excel
excel = xlsxwriter.Workbook('study.xlsx')
# 添加工作簿
book = excel.add_worksheet('考试成绩')
title = ['姓名','性别','年龄','成绩','等级']
data = [['Adela','woman','20','90','1'],['Zoya','woman','24','95','2']
]
for index,item in enumerate(title):# 向表格中写入内容,参数1:行索引;参数2:列索引;参数3:内容book.write(0,index,item)
for row_index, row_data in enumerate(data):for col_index, item in enumerate(row_data):book.write(row_index + 1, col_index, item)  # 从第 1 行开始写入数据
excel.close()

3.复制excel文档

代码思路:读取+新建+写入

import xlsxwriter
import xlrd
def read():result = []excel = xlrd.open_workbook('study.xlsx')book = excel.sheet_by_name('考试成绩')for i in book.get_rows():content = []for j in i:content.append(j.value) # 行中的每一个格子里的数据,并封装到content列表中,作为一行数据result.append(content) # 将每一个行的数据追加到返回结果集列表中return resultdef write(content):excel = xlsxwriter.Workbook('study_copy.xlsx')book = excel.add_worksheet('考试成绩')for index,data in enumerate(content):for sub_index,sub_data in enumerate(data):book.write(index,sub_index,sub_data)excel.close()
if __name__ == '__main__':result = read()write(result)

4.生成excel并附带图表

import xlsxwriter
excel = xlsxwriter.Workbook('study1.xlsx')
book = excel.add_worksheet('成绩等级')
data = [['优秀','良好','中等','一般'],[1100,2000,1000,500]
]
book.write_column('A1',data[0])
book.write_column('B1',data[1])
# 绘制图表
# 参数1:图表类型 type声明设置类型,column柱状图
chart = excel.add_chart({'type':'column'})
# 定义要展示的数据
chart.add_series({'categories':'=成绩等级!$A1:$A4','values':'=成绩等级!$B1:$B4','name':'成绩占比'})
# 设置图表标题
chart.set_title({'name':'成绩占比图'})
# 向表格中插入图表
# 参数1:位置;参数2:图表的引用名
book.insert_chart('A10',chart)
excel.close()

3.读取并计算数据

1.安装工具

终端下载操作excel文档的工具库(大多用于读取、写入和修改等 ):

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlutils

2.读取数据

编程思路:

1.打开 Excel 文件;

2.获取第一个工作表;

3.初始化两个数据:分别是用于存储按分类汇总的总价goods_type与每行的单品总价count_price

4.用遍历对每一行计算单品总价

5.最后返回goods_typecount_price

def read_data():wb = xlrd.open_workbook('goods.xlsx')sh = wb.sheet_by_index(0)goods_type = {} # 分类总价 {水果:20,生活用品:30}count_price = [] # 单品总价 [10,20,30]for r in range(sh.nrows):# sh.cell_value(r,4)获得格子中的数据,参数1行索引值,参数2列索引值count = sh.cell_value(r,3)*sh.cell_value(r,4)#将计算的小计值追加到单品总价中count_price.append(count)key = sh.cell_value(r,0)# 判断分类总价中是否包含该商品,如包含则追加计算if goods_type.get(key):goods_type[key] += countelse:goods_type[key] = countreturn goods_type,count_price

3.保存数据

def save(_type,_count):wb = xlrd.open_workbook('goods.xlsx')sh_t = wb.sheet_by_index(0)wb2 = copy(wb) # 复制当前的商品表格sh = wb2.get_sheet(0)for r in range(sh_t.nrows):sh.write(r,sh_t.ncols,_count[r])sh2 = wb2.add_sheet('汇总的数据')for i,key in enumerate(_type.keys()):sh2.write(i,0,key)sh2.write(i,1,_type[key])wb2.save('商品汇总数据.xlsx')

4.主程序

read_data():读取并自动匹配汇总数据和单品总价

save():将结果保存到新的 Excel 文件中

if __name__ == '__main__':t,c = read_data()save(t,c)

4. 拆分Excel文件

将Excel表格中的数据按照A1列分类,并按类别存到不同的sheet页中

import xlrd
from xlutils.copy import copydef get_data():wb = xlrd.open_workbook('goods.xlsx')sh = wb.sheet_by_index(0)"""{a:[{},{},{}],b:[{},{},{}],c:[{},{},{}],}"""all_data = {}for r in range(sh.nrows):d = {'type':sh.cell_value(r,1),'name':sh.cell_value(r,2),'price':sh.cell_value(r,3),'count':sh.cell_value(r,4)}key = sh.cell_value(r,0)if all_data.get(key):all_data[key].append(d)else:all_data[key] = [d]return all_datadef save(data):wb = xlrd.open_workbook('goods.xlsx')wb2 = copy(wb)for key in data.keys():temp_sheet = wb2.add_sheet(key)for i,d in enumerate(data[key]):temp_sheet.write(i, 0, d.get('type'))temp_sheet.write(i, 1, d.get('name'))temp_sheet.write(i, 2, d.get('price'))temp_sheet.write(i, 3, d.get('count'))wb2.save('表格拆分.xlsx')
if __name__ == '__main__':all_data = get_data()save(all_data)

5. 合并Excel文件

终端下载操作excel文档的工具库(除了读取写入,还包括格式化单元格、插入图表、处理多个工作表等功能,功能比xlutils强大,支持大数据量的处理 ):

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl

 1.合并至同一sheet页

from openpyxl import load_workbook,Workbook
import os
def copy_data():wb = Workbook() # 获得excel对象sh = wb.active # 获得焦点sheet页all_data = []for name in os.listdir('./销售表'):path = f'./销售表/{name}'tmp_wb = load_workbook(path)tmp_sh = tmp_wb.activefor r in range(1,tmp_sh.max_row+1):# 获取整行数据row_value = []for c in range(1,tmp_sh.max_column+1):value = tmp_sh.cell(r,c).valuerow_value.append(value)# 将获取的行数据,添加到全局数据里if row_value not in all_data:all_data.append(row_value)# 将数据追加至新的excel中for data in all_data:sh.append(data)wb.save('合并Excel.xlsx')
if __name__ == '__main__':copy_data()

2.合并至多个sheet页

from openpyxl import load_workbook,Workbook
import os
def copy_data():wb = Workbook()for name in os.listdir('./销售表'):path = f'./销售表/{name}'tmp_wb = load_workbook(path)tmp_sh = tmp_wb.active# 创建sheet页sh = wb.create_sheet(name[:-5]) # 单肩包.xlsx->单肩包for r in range(1,tmp_sh.max_row+1):row_value = []for c in range(1,tmp_sh.max_column+1):value = tmp_sh.cell(r,c).valuerow_value.append(value)sh.append(row_value)del wb['Sheet']wb.save('合并至多个sheet页.xlsx')
if __name__ == '__main__':copy_data()

6. 生成工资条

 省脑细胞式描述:遍历原始工作表的每一行,再单独存到一个新Excel表中

from openpyxl import load_workbook,Workbook
def create_excel():wb = load_workbook('工资数据.xlsx')sh = wb.activetitle = ["工号”,“姓名","部门", "基本工资","提成","加班工资","社保扣除","考勤扣除","应付工资","邮箱"]for i,row in enumerate(sh.rows):if i == 0:continueelse:temp_wbook = Workbook()temp_sh = temp_wbook.activetemp_sh.append(title)row_data = [cell.value for cell in row] #['5732','Adela','研发部','8000',......]获得当前行的数据temp_sh.append(row_data) # 将当前行数据追加直sheet页中temp_wbook.save(f'./工资条/{row_data[1]}.xlsx')
if __name__ == '__main__':create_excel()

当然你可以再把他们合并成一起当作练习,并在新的sheet页中显示工资数的柱状图:

import xlsxwriter
from openpyxl import load_workbook, Workbook
import osdef combine_data():wb = Workbook()sh = wb.activeall_data = []for name in os.listdir('./工资条'):path = f'./工资条/{name}'tmp_wb = load_workbook(path)tmp_sh = tmp_wb.activefor r in range(1, tmp_sh.max_row + 1):row_value = []for c in range(1, tmp_sh.max_column + 1):value = tmp_sh.cell(r, c).valuerow_value.append(value)if row_value not in all_data:all_data.append(row_value)for data in all_data:sh.append(data)wb.save('合并工资条.xlsx')return all_datadef create_chart(data):# 创建新Excelwb = xlsxwriter.Workbook('图表.xlsx')ws = wb.add_worksheet()# 写入数据for row_num, row in enumerate(data):for col_num, value in enumerate(row):ws.write(row_num, col_num, value)# 创建柱状图(假设第2列是姓名,第8列是工资)chart = wb.add_chart({'type': 'column'})chart.add_series({'categories': f'=Sheet1!$B$1:$B${len(data)}','values': f'=Sheet1!$H$1:$H${len(data)}'})# 插入图表ws.insert_chart('K2', chart)wb.close()if __name__ == '__main__':data = combine_data()  # 合并数据create_chart(data)  # 生成图表

7.统计加班时间

1.搭建一个数据表格

from datetime import date
from openpyxl import load_workbook,Workbook
def create_data():wb =Workbook()sh = wb.activerows = [['Date','姓名','打卡时间'],[date(2025, 4, 2), '张三', '18:50'],[date(2025, 4, 2), '李四', '19:15'],[date(2025, 4, 4), '王五', '22:30'],[date(2025, 4, 5), '赵六', '18:45'],[date(2025, 4, 6), '钱七', '17:20'],[date(2025, 4, 7), '孙八', '19:05'],[date(2025, 4, 8), '周九', '21:10'],[date(2025, 4, 9), '吴十', '22:35'],[date(2025, 4, 2), '李四', '19:15'],]for row in rows:sh.append(row)wb.save('打卡时间.xlsx')

2.处理表格数据

def statistics():wb = load_workbook('打卡时间.xlsx')sh = wb.activedata = []for i in range(2, sh.max_row + 1):t_data = []for j in range(1, sh.max_column + 1):t_data.append(sh.cell(i, j).value)# 统计计算h, m = t_data[2].split(":")full = int(h) * 60 + int(m)  # 打卡时间转换成分钟tmp = full - 18 * 60  # 与18:00的差值t_data.append(tmp)t_data[0] = t_data[0].date()data.append(t_data)n_wb = Workbook()n_sh = n_wb.activefor d in data:n_sh.append(d)n_wb.save('统计时间.xlsx')

3.主程序

if __name__ == '__main__':
    statistics()
    create_data()

8.查重复数据

查询是否有重复的人名

from openpyxl import load_workbook,Workbook
from openpyxl.styles import PatternFill
import os
def dum():wb = load_workbook('打卡时间.xlsx')sh = wb.activeindex = [] #存放重复数据的索引值tmp = []for i,c in enumerate(sh['B']):flag = c.value not in tmpif flag:tmp.append(c.value)else:index.append(i)fill = PatternFill('solid',fgColor='AEEEEE')for i,r in enumerate(sh.rows):if i in index:for c in r:c.fill = fillprint(f'第{i+1}条数据是重复数据')wb.save('查重复数据.xlsx')
if __name__ == '__main__':dum()

9.提取身份证号信息

根据身份证号码的格式,提取出生辰年月,并进行年龄等数学运算

from openpyxl import load_workbook
from datetime import datetime
def get_code():now_year = datetime.now().yearwb = load_workbook('身份证信息.xlsx')sh = wb.activemax_colunm = sh.max_columnfor i,cell in enumerate(sh['B']):pno = cell.value# 6位行政区号 4位年份 2位月份 2月日期 4位个人识别码year = pno[6:10]month = pno[10:12]day = pno[12:14]age = now_year - int(year)sh.cell(i + 1, max_colunm + 1).value = yearsh.cell(i + 1, max_colunm + 2).value = monthsh.cell(i + 1, max_colunm + 3).value = daysh.cell(i + 1, max_colunm + 4).value = agewb.save('提取身份证号信息.xlsx')
if __name__ == '__main__':get_code()

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

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

相关文章

go语言:开发一个最简单的用户登录界面

1.用deepseek生成前端页面&#xff1a; 1.提问&#xff1a;请你用html帮我设计一个用户登录页面&#xff0c;要求特效采用科技感的背景渲染加粒子流动&#xff0c;用css、div、span标签&#xff0c;并给出最终合并后的代码。 生成的完整代码如下&#xff1a; <!DOCTYPE h…

blender二次元上色

前&#xff1a; 后&#xff1a;&#xff08;脸自己会发光) 参考&#xff1a;05-模型导入与材质整理_哔哩哔哩_bilibili

Mysql+Demo 获取当前日期时间的方式

记录一下使用Mysql获取当前日期时间的方式 获取当前完整的日期时间有常见的四种方式&#xff0c;获取得到的默认格式(mysql的格式标准)是 %Y-%m-%d %H:%i:%s其它格式 %Y-%m-%d %H:%i:%s.%f方式一&#xff1a;now()函数 select now();mysql> select now(); -------------…

C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别

目录 一、什么是静态的&#xff1f;什么是常量&#xff1f; 1. ​静态&#xff08;Static&#xff09;​ 2. ​常量&#xff08;const&#xff09;​ 二、类中的静态成员有什么用&#xff1f; 1. ​共享数据 2. ​工具方法与全局配置 3. ​单例模式 三、静态类和静态成…

FreeRTOS源码下载分享

FreeRTOS源码下载分享 官网下载太慢了&#xff0c;分享下FreeRTOSv202411 FreeRTOSv202411.00.zip 链接: https://pan.baidu.com/s/1P4sVS5WroYEl0WTlPD7GXg 提取码: g6aq

2025年win10使用dockerdesktop安装k8s

一、写作背景 百度了一圈&#xff0c; 要么教程老&#xff0c;很多操作步骤冗余&#xff0c; 要么跑不通&#xff0c;或者提供的链接失效等情况。 二、看前须知 1、安装过程使用的AI辅助&#xff0c; 因为参考的部分博客卡柱了。 2、如果操作过程中遇到卡顿&#xff0c; …

一段式端到端自动驾驶:UniAD:Planning-oriented Autonomous Driving

论文地址:https://arxiv.org/pdf/2212.10156 代码地址:https://github.com/OpenDriveLab/UniAD 1. 摘要 现代自动驾驶系统通常由一系列按顺序执行的模块任务构成,例如感知、预测和规划。为了完成多种任务并实现高级别的智能化,当前的方法要么为每个任务部署独立模型,要…

【企业文化】CXO是什么?

李升伟 整理 CXO 是企业中高层管理职位的统称&#xff0c;其中的 “X” 是一个变量&#xff0c;代表不同的职能领域。CXO 通常指企业最高管理层中的各个负责人&#xff0c;他们共同参与企业的战略决策和运营管理。以下是一些常见的 CXO 职位及其职责&#xff1a; 1. CEO&…

python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘

python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一种字符串前缀,用于创建格式化字符串(也称为 f-string),它是 Python 3.6 及更高版本引入的一种方便的字符串格式化方式。 基本语法和功能 当你在字符串前加上 f 前缀时,…

论文浅尝 | Interactive-KBQA:基于大语言模型的多轮交互KBQA(ACL2024)

转载至&#xff1a;何骏昊 开放知识图谱 原文地址&#xff1a;论文浅尝 | Interactive-KBQA&#xff1a;基于大语言模型的多轮交互KBQA&#xff08;ACL2024&#xff09; 笔记整理&#xff1a;何骏昊&#xff0c;东南大学硕士&#xff0c;研究方向为语义解析 论文链接&#xff…

MySQL注入中user-agent和cookie存在的注入

uagent注入 1、漏洞成因&#xff1a; 当Web应用程序将用户提供的User-Agent值未经处理直接拼接到SQL查询语句时&#xff0c;攻击者可以通过构造恶意User-Agent值闭合原有SQL语句并注入任意SQL代码。 2、以less-18为例&#xff1a; 相比前几关&#xff0c;第18关对于uname和pa…

【算法数学篇】试除法求约数

题解&#xff1a;试除法求约数 题目传送门 869. 试除法求约数 一、题目描述 给定 n 个正整数 aᵢ&#xff0c;对于每个整数 aᵢ&#xff0c;按照从小到大的顺序输出它的所有约数。 输入格式&#xff1a; 第一行包含整数 n接下来 n 行&#xff0c;每行包含一个整数 aᵢ 输…

《UNIX网络编程卷1:套接字联网API》第5章 TCP客户服务器程序示例

《UNIX网络编程卷1&#xff1a;套接字联网API》第5章 TCP客户/服务器程序示例 5.1 本章目标与示例程序概述 本章通过一个完整的TCP回射&#xff08;Echo&#xff09;客户/服务器程序&#xff0c;深入解析TCP套接字编程的核心流程与关键问题。示例程序的功能为&#xff1a;客户…

封装可拖动弹窗(vue jquery引入到html的版本)

vue cli上简单的功能&#xff0c;在js上太难弄了&#xff0c;这个弹窗功能时常用到&#xff0c;保存起来备用吧 备注&#xff1a;deepseek这个人工智障写一堆有问题的我&#xff0c;还老服务器繁忙 效果图&#xff1a; html代码&#xff1a; <div class"modal-mask&qu…

编译器工具链是什么?

编译器工具链&#xff08;Compiler Toolchain&#xff09; 是一组用于将源代码转换为可执行程序的工具和库的集合。它涵盖了从源代码编写到程序运行的整个构建过程&#xff0c;包括编译、汇编、链接等多个阶段。以下是关于编译器工具链的详细解释&#xff1a; 一、编译器工具链…

Spring Boot 集成Redis中 RedisTemplate 及相关操作接口对比与方法说明

RedisTemplate 及相关操作接口对比与方法说明 1. RedisTemplate 核心接口与实现类 RedisTemplate 是 Spring Data Redis 的核心模板类&#xff0c;通过 opsFor... 方法返回不同数据类型的操作接口&#xff0c;每个接口对应 Redis 的一种数据结构。以下是主要接口及其实现类&am…

linux内核漏洞检测利用exp提权

案例一dirtycow&#xff08;CVE-2016-5159&#xff09; 有个前置知识就是 获取liunx的内核 hostnamectl uname -a 然后这个内核漏洞进行提权的步骤也是和手工win进行提权差不多 也是需要使用辅助工具在本地进行辅助检测 然后去nomi-sec/PoC-in-GitHub&#xff1a; &#…

重磅 | CertiK《Hack3d:2025第一季度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2025年第一季度安全报告》现已发布&#xff0c;本次报告深入分析了2025年1至3月Web3.0领域的安全状况。2025年第一季度共发生197起安全事件&#xff0c;总损失约为16.7亿美元&#xff0c;环比激增303.4%。其中Bybit事件导致约14.5亿美元的损失&#…

经典卷积神经网络LeNet实现(pytorch版)

LeNet卷积神经网络 一、理论部分1.1 核心理论1.2 LeNet-5 网络结构1.3 关键细节1.4 后期改进1.6 意义与局限性二、代码实现2.1 导包2.1 数据加载和处理2.3 网络构建2.4 训练和测试函数2.4.1 训练函数2.4.2 测试函数2.5 训练和保存模型2.6 模型加载和预测一、理论部分 LeNet是一…

二维码扫不出?用QR Research工具

一.简介 简单来说QR Research就是用来扫二维码的工具 当二维码模糊不清&#xff0c;无法用普通方式扫时&#xff0c;就可以用QR Research轻松扫描。QR Research还可以分析变形/破损二维码&#xff08;修复或提取有效部分&#xff09; 二.下载安装 QR Research 三.例题 这…