Python效率革命——处理Excel表格

Excel是Windows环境下运行的强大的电子表格应用。一个Excel电子表格称为一个工作簿,一个工作簿保存在拓展名为.xlsx的文件中。每个工作簿可以包含多个表(工作表)用户当前查看的表(或者关闭前最后查看的表)称为活动表。每个表都有行(数字表示)和列(字母表示)

第三方模块openpyxl模块让Python程序可以读取和修改Excel,下图列举了其它表格处理的功能矩阵,可以看出openpyxl是全面的,所以我挑选了这个第三方模块作为学习对象。图片由小甲鱼老师整理

安装模块


pip install openpyxl#轻轻松松

读取Excel文档

  • 用openpyxl模块打开Excel文档
import openpyxl
wb=openpyxl.load_workbook('example.xlsx')

openpyxl.load_workbook()函数接受文件名,返回一个workbook数据类型的值,这个workbook对象代表这个Excel文件(即工作簿)

从工作簿中取得工作表

工作表之下每个工作表由worksheet对象表示,可以用 工作簿变量.get_sheet_by_name() 传入工作表名字符串获得 现在版本用工作簿对象[“工作表名称”]即可

import openpyxl
wb=openpyxl.load_workbook('example.xlsx')
sheet=wb["Sheet1"]   取得Sheet1工作表对象

还可以用get_active_sheet()取得活动工作表对象
worksheet.active 取得活动工作表对象
worksheet.title,title属性 可以获得工作表的名称

sheet2=wb.active#取得活动表对象

获得所有工作表名称的列表

wb.sheetnames#获得所有工作表名称的列表
从表中取得单元格

有了Worksheet对象后就可以按名字访问Cell对象(单元格的意思)
Cell对象有一个value属性,一般包含这个单元格中保存的值
Cell对象还有row、column和coordinate属性

Worksheet[cell位置].value-----------------返回单元格保存的值
Worksheet[cell位置].row-------------------返回单元格所在的行
Worksheet[cell位置].column--------------返回单元格所在的列
Worksheet[cell位置].coordinate----------返回单元格所在的位置(行+列)

在调用表的cell()方法时,row 和column都可以用数字表示,第一行/列的整数是1,不是0

sheet.cell(row=1,column=2).value()#这个表示表的B1对象,行1列2 等于sheet['B1']

可以通过下面两个函数确定表的大小

sheet.get_highest_row()#工作表的行的max值
sheet.get_highest_column()#工作表的列的max值

上面的两个函数以及被删除了,现在获取max值的方式是

sheet.max_row  
sheet.max_column 
列字母和数字之间的切换

字母转数字,调用openpyxl.cell.column_index_from_string()函数
数字转字母,调用openpyxl.cell.get_column_letter()函数

from openpyxl.cell import get_column_letter,column_index_from_string
get_column_letter(1)
'A'
column_index_from_string('A')#从字符串索引
1
  • 从表中取得行和列

可以将Worksheet对象切片,取得电子表格中一行、一列或一个矩形区域中的所有单元格Cell对象

示例表格
示例表格

import openpyxl
wb=openpyxl.load_workbook('example.xlsx')
sheet=wb["Sheet1"]
for i in sheet['A1':'C3']:#切片
    for n in i:
        print(n.coordinate,n.value)
    print("---下一行----")

结果–

D:\recent\code\venv\Scripts\python.exe D:/recent/code/venv/XKCD.py
A1 2015-04-05 13:34:01.999997
B1 Apples
C1 73
---下一行----
A2 2015-04-05 03:41:22.999998
B2 Cherries
C2 85
---下一行----
A3 2015-04-06 12:46:50.999998
B3 Pears
C3 14
---下一行----

为什么需要两层循环才能打印所有单元格值?

tuple(sheet['A1':'C3'])

打印结果

((<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>), (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>))

发现元组之下还有三个元组,内部的每个元组表示一行
第一个for循环获取(<Cell ‘Sheet1’.A1>, <Cell ‘Sheet1’.B1>, <Cell ‘Sheet1’.C1>)等三个元素即第一行
第二个for获取每行下单个单元格对象


写入Excel文档

openpyxl也提供了一些方法写入数据,这就意味着程序可以创建和编辑电子表格文件

创建并保存Excel文档
import openpyxl
wb=openpyxl.Workbook()

sheet=wb.active#获取活动表
sheet.title='box'#工作表重命名
wb.save('bg.xlsx')#保存表格

这就创建了一个bg的工作簿下面有一个box工作表
在这里插入图片描述

创建和删除工作表

创建工作表 create_sheet()

import openpyxl
wb=openpyxl.Workbook()
wb.create_sheet()#一般模式:按照sheet1,sheet2,3,4创建
wb.create_sheet()
print(wb.sheetnames)
wb.create_sheet(index=0,title='dasheet')#高级模式:指定索引位置指定表名创建
print(wb.sheetnames)

执行结果如下

D:\recent\code\venv\Scripts\python.exe D:/recent/code/venv/biaoge.py
['Sheet', 'Sheet1', 'Sheet2']
['dasheet', 'Sheet', 'Sheet1', 'Sheet2']

删除工作表remove_sheet()方法

#...接上面的代码
wb.remove(wb['dasheet'])
print(wb.sheetnames)

执行结果

['Sheet', 'Sheet1', 'Sheet2']

将值写入单元格
#接上面的代码
ws=wb['Sheet']
ws['A1']='hello python '
wb.save('hello.xlsx')

在这里插入图片描述


设置单元格字体风格与类型

定义单元格字体类型与风格需要导入openpyxl.styles下的Font模块,也就是字体模块,Font可传入字体名称,字体大小,加粗或者斜体

关键字参数 数据类型 描述
name 字符串 字体名称,比如“微软雅黑”
size 整型 字体大小
bold 布尔型 加粗与否
italic 布尔型 斜体与否
from openpyxl.styles import Font
import openpyxl
wb=openpyxl.Workbook()
wb.create_sheet(index=0,title='Sheet1')
ws=wb['Sheet1']
ws['A1']='HELLO PYTHON'
ws['A1'].font=Font(size=50,bold=True)#默认字体50号加粗
ws['A2']='HELLO PYTHON'
ws['A2'].font=Font(name='微软雅黑',size=50,bold=True)#雅黑50号字加粗
wb.save('style.xlsx')

结果如下
在这里插入图片描述


公式

公式以一个等号开始,可以配置单元格,让它包含通过其它单元格计算得到的值
其实和在表格中输入公式类似
例如下面这个表格shili.xlsx
在这里插入图片描述

import openpyxl
wb=openpyxl.load_workbook('shili.xlsx')
ws=wb['Sheet']
ws['B12']='=SUM(B2:B11)'
wb.save('shili-copy.xlsx')

结果如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200514233109489.png
这其实也只是在表格中添加了公式,在表格中内部操作而已,这个时候如果我打印B12的值,那么结果是多少嘞?

print(ws['B12'].value)

结果如下

=SUM(B2:B11)

如果我希望取到的都是单元格的值而不是公式则需要将load_workbook()的data_only关键字设置为True

import openpyxl
wb=openpyxl.load_workbook('shili-copy.xlsx',data_only=True)
ws=wb['Sheet']
print(ws['B12'].value)

这里的结果我崩了。。。返回了None 求解释

None

调整行和列

设置行高和列宽
import openpyxl
wb=openpyxl.Workbook()
ws=wb.active
ws['A1']='行高'
ws['B2']='列宽'
ws.row_dimensions[1].height=100#设置行高100,中括号中指定行
ws.column_dimensions['B'].width=100#设置列宽100,中括号中指定列
wb.save('设置行高列宽.xlsx')

结果如下,由于列宽以字符为默认单位,行高以磅值为默认单位,所以大小不一样
在这里插入图片描述

合并和拆分单元格

合并单元格:利用merge_cells()工作表方法,可以将一个矩形区域中的单元格合并为一个单元格

import openpyxl
wb=openpyxl.Workbook()
ws=wb.active
ws['A1']='行高'
ws.merge_cells('A1:B3')
wb.save('设置行高列宽.xlsx')

结果如下
在这里插入图片描述
merge_cells()的参数是一个字符串表示要合并的矩形区域左上角和右下角的单元格

拆分单元格:unmerge_cells()工作表方法

import openpyxl
wb=openpyxl.load_workbook('设置行高列宽.xlsx')
ws=wb.active
#ws['A1']='行高'
ws.unmerge_cells('A1:B3')#
wb.save('设置行高列宽.xlsx')

在这里插入图片描述

冻结窗格

每个worksheet对象都有一个freeze_panes属性,可以设置为一个cell对象或者一个单元格坐标的字符串

import openpyxl
wb=openpyxl.load_workbook('设置行高列宽.xlsx')
ws=wb.active
#ws['A1']='行高'
ws.freeze_panes='B5'#第一行和前四列冻结
wb.save('设置行高列宽.xlsx')

结果是这样的
在这里插入图片描述

图表

openpyxl支持利用工作表中单元格的数据,创建条形图、折线图、散点图和饼图
要创建图表,需要做下列事情:
1从一个矩形区域选择的单元格,创建一个Reference对象
2通过传入Reference对象,创建一个Series对象
3创建一个Chart对象,即空白图表
4将Series对象添加到Chart对象,对空白图表添加数据的意思
5可选:设置Chart对象的drowing.top、drowing.left、drowing.width和drowing.height~变量
这四个变量表示了Chart对象距离顶部和左侧的位置(定位)以及Chart对象的长宽大小,即图表的位置和大小

新版本是通过chart.width ,chart.height 对象确定图表大小
通过sheet.add_chart( )函数将Chart对象添加到Worksheet对象并确定图表的位置
6将Chart对象添加到Worksheet对象

Reference对象是通过调用openpyxl.charts.Reference()函数并传入 五个参数创建的
参数一:worksheet对象
参数二:两个整数的元组,代表矩形选择区域的左上角单元格
参数三:两个整数的元组,代表矩形选择区域的右下方角单元格
这三个参数划分了图表涵盖的数据

参数二到五:min_col=1, min_row=1, max_col=1, max_row=10分别表示,最小列,最小行,最大列和最大行

import openpyxl


wb = openpyxl.Workbook()
sheet = wb.active # 在不知道表名时,利用active直接打开正在运行的表

# 表的第一列输入一些数据 
for i in range(1, 11):
    sheet['A' + str(i)] = i
#上面都是创建表格   
reference = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1, max_row=10)#源数据的区域
series = openpyxl.chart.Series(reference, title='图表标题')
chart = openpyxl.chart.BarChart()#生成一个空白柱状图

chart.append(series)#把数据和标题加进来

# 窗口的大小
chart.width = 10
chart.height = 10

sheet.add_chart(chart, 'C2') # 窗口位置
wb.save('图表.xlsx')

执行结果如下
在这里插入图片描述


原创文章 26 获赞 18 访问量 4062

猜你喜欢

转载自blog.csdn.net/Pyouthon/article/details/106084928