openpyxl操作数据表格
笔者是2024年开始学习的python处理excel数据,当时一上来直接接触的就是pandas,matplotlib这些库,pandas库用来进行计算和分析是非常方便的,不过也正是因为太过于方便,导致笔者觉得其它库都是垃圾。
excel从大到小依次是工作簿,工作表,单元格,单元格又分为单元格的属性和内容。而pandas库最关注的是数据之间的计算,而对于表格的批量处理等,笔者在使用的过程中总觉得它有些浮在表面上,这不是pandas库的问题,而是笔者我自己的问题。我应该从基础开始,先学会如何一个个处理这些单元格和表格,再学习如何将它们进行整合。
pandas里面的Series和Dataframe等数据结构,底层是基于另一个科学计算库numpy,这又是另外一个非常好的第三方库。
因此,这次笔者决定从openpyxl开始,先学习如何一个个处理单元格,学习xlwings(这个库类似于vba),最后再学习pandas,以及可视化的matplotlib,seaborn等库。
今天我们就一起来学习openpyxl库。
前言
一、准备工具
工具使用:python, excel ,pycharm
pycharm是一个用来编写python代码的工具,不了解的朋友先自行去了解上面三个工具。
二、工资表生成工资条
先看结果
import openpyxl
wb1=openpyxl.Workbook()
ws1=wb1.active
rows=[["姓名","性别","年纪","工资"],["张三","男",24,6000],["张三","男",24,6000],["张三","男",24,6000],["张三","男",24,6000],
["张三","男",24,6000],["张三","男",24,6000],["张三","男",24,6000]]
for row in rows:
ws1.append(row)
wb1.save("工资表.xlsx")
area=ws1["a1":"d1"]
row=0
maxcol=ws1.max_row
mincol=ws1.min_row
for i in range(mincol+2,maxcol+1):
ws1.insert_rows(i+row,2)
for datarow in area:
data=list(datarow)
for j,d in enumerate(data):
ws1.cell(row=i+row+1,column=j+1,value=d.value)
row=row+2
wb1.save("工资条.xlsx")
在本地生成两个表格
工资表:
工资条:
接下来我们逐步分析这个代码:
第一行:import openpyxl
导入openpyxl库,需要注意的是,这个库需要我们去下载,
我们在终端输入;pip install openpyxl就可以下载了,这里我已经下载好了,所以显示已经存在,只是需要我去更新,当然,不更新也无妨
第二行:wb1=openpyxl.Workbook()
这行代码的意思是新建立一个excel工作簿,注意Workbook需要大写
第三行:ws1=wb1.active
意思是用ws1来代替刚才新建的excel工作簿的活动工作表,通常用wb1=openpyxl.Workbook()建立的工作簿只有一个工作表,名字就是sheet
第四行和第五行是建立一个数据列表,用于往新建立的表格里面填充数据
可以看到第一个列表里面的:“姓名”,“性别”,“年纪”,“工资”,是我们新建立的表格的标题行,后面则是七个人,它们都叫张三,男生,今年24岁,工资6000(已经很高了)
第六,七,八行是依次遍历读取列表里面的员工的工资数据,将它们加入到新建立的wb1这个工作簿的ws1这个工作表中
最后将这个表保存到本地,名字是“工资表”
接下来的代码就是将工资表转化为工资条,我们在上面有图片展示最后工资条的样子
常规的做法就是依次在工资表的第三行到第八行这六个员工的上面插入两行,然后将标题行复制粘贴到两行空白行的第二行
如果有很多人,那么我们一行行去添加就很慢,那么怎么使用Python批量处理呢
第九行:area=ws1[“a1”:“d1”]
在我们生成的工资表中,标题就是从a1单元格到d1单元格之间的内容,
所以我们先用一个变量area来表示标题行这个区域,用于后续的插入
第十行:row=0
row这个变量用于我们计数
第十一行十二行:
maxcol=ws1.max_row
mincol=ws1.min_row
这里我们使用两个变量maxcol,mincol来获取工资表中,有数据的区域的首行的行数和最后一行的行数
很明显首行是1,最后一行是8
所以maxcoi等于8,mincol等于
接下来的部分:
for i in range(mincol+2,maxcol+1):
ws1.insert_rows(i+row,2)
for datarow in area:
data=list(datarow)
for j,d in enumerate(data):
ws1.cell(row=i+row+1,column=j+1,value=d.value)
row=row+2
这里面;
for i in range(mincol+2,maxcol+1):的range(mincol+2,maxcol+1)用来表示我们要对哪些行进行操作,很明显,在上面生成的工资表中,我们需要对第三行到第八行这6各员工进行操作
range()里面有两个参数,从左到右依次为最小值,最大值,其中它包括最小值,不包括最大值
所以我们如果想表示3,4,5,6,7,8,那么应该是range(3,9),从3到9,包括3不包括9
ws1.insert_rows(i+row,2)表示往上面插入两行
for datarow in area:表示依次遍历标题列表中的每一个数据,
data=list(datarow)表示将数据转化为列表
for j,d in enumerate(data):表示依次遍历列表中的数据
ws1.cell(row=i+row+1,column=j+1,value=d.value)表示将遍历出的数据加入到每一个员工的上一行
row=row+2 每次插入两行后,这个变量要加2
wb1.save(“工资条.xlsx”)最后我们将生成的工资条这个表格保存到本地
总结
笔者在写这篇文章时,已经对openpyxl了解了一部分,通过这个生成工资表,然后将工资表转化为工资条的的例子,将学到的知识做了一个综合的运用。
希望能给各位带来帮助。