目录
[1.1 创建python项目](#1.1 创建python项目)
[1.2 安装openpyxl依赖](#1.2 安装openpyxl依赖)
[3.1 创建空白工作簿](#3.1 创建空白工作簿)
[3.2 写数据](#3.2 写数据)
[4.1 字体样式](#4.1 字体样式)
[4.2 设置单元格背景填充色](#4.2 设置单元格背景填充色)
[4.3 设置单元格边框样式](#4.3 设置单元格边框样式)
[4.4 单元格对齐方式](#4.4 单元格对齐方式)
[4.5 数据筛选](#4.5 数据筛选)
[5.1 设置公式](#5.1 设置公式)
[5.2 读取公式结果](#5.2 读取公式结果)
[7.1 合并](#7.1 合并)
[7.2 拆分](#7.2 拆分)
[8.1 冻结](#8.1 冻结)
[8.2 解冻](#8.2 解冻)
一、环境安装
python处理Excel的方式:openpyxl
1.1 创建python项目
指定虚拟环境为python3.9版本...
![](https://file.jishuzhan.net/article/1771112152325689346/0985a45b53a9191a06880e83bf203c2e.webp)
1.2 安装openpyxl依赖
bash
pip install openpyxl==3.0.7
二、Excel数据读取操作
我们先准备一个名为test.xlsx的表格。
![](https://file.jishuzhan.net/article/1771112152325689346/32c85dcb9e7690c40db32c312ee86bce.webp)
python
import openpyxl
# 创建一个工作簿对象
wb = openpyxl.load_workbook('./test.xlsx')
# 获取工作簿的sheet表的名称
sheet_list = wb.sheetnames
print(sheet_list) # ['作家列表', '学生列表']
sheet = wb['作家列表']
# 获取活动表
print(wb.active) # <Worksheet "学生列表">
cell = sheet['A3']
print(cell.value) # 余华
print(cell.row) # 3
print(cell.column) # 1
print(cell.coordinate) # A3
# 获取第1行第2列的值
cell = sheet.cell(row=1, column=2).value
print(cell) # 书籍
# 进行切片操作,从而取得电子表格中一行、一列或一个矩形区域中所有Cell对象
for cell_row in sheet['A1':'B4']:
for cell in cell_row:
print(cell.coordinate, cell.value)
# 要访问特定行或列的单元格的值,也可以使用Worksheet对象的rows和columns属性
for cell in list(sheet.columns)[0]: # 获取第一列的cell
print(cell.value)
# 获取工作表中行数和列数
print(sheet.max_row) # 4
print(sheet.max_column) # 2
三、Excel数据写入操作
3.1 创建空白工作簿
python
import openpyxl
# 创建一个新的工作簿对象
wb = openpyxl.Workbook()
# 给工作簿设置名称
sheet = wb.active
sheet.title = '跟进记录表'
# 保存工作表
wb.save('./第一个工作簿.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/3047ac14c0208f750806ed214e4c8e10.webp)
3.2 写数据
python
import openpyxl
# 创建一个新的工作簿对象
wb = openpyxl.load_workbook('./第一个工作簿.xlsx')
# 创建sheet
wb.create_sheet(title='销售记录')
wb.create_sheet(index=1, title='养殖技术')
print(wb.sheetnames) # ['跟进记录表', '养殖技术', '销售记录']
# 删除sheet页
del wb['养殖技术']
print(wb.sheetnames) # ['跟进记录表', '销售记录']
sheet = wb['销售记录']
sheet['A1'] = 'hello'
sheet['B2'] = 'world'
wb.save('./第一个工作簿.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/bf0bf26542f3e4044d73b51b45c06bca.webp)
四、设置单元格样式
4.1 字体样式
python
from openpyxl.styles import Font
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['A3'] = '字体'
sheet['A3'].font = Font(name='楷体', color='8470FF')
wb.save('./styles.xlsx')
Font()的参数有很多,比如:
- italic=True:设置斜体
- size=xxx:设置字体大小
- underline='sigle':单下划线
- b=True:加粗
- ....
![](https://file.jishuzhan.net/article/1771112152325689346/7d579f1b1bd26847214cbb59745dc513.webp)
4.2 设置单元格背景填充色
python
from openpyxl.styles import Font, PatternFill
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['A3'] = '背景填充色'
sheet['A3'].fill = PatternFill(patternType='solid', fgColor='8470FF')
wb.save('./styles.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/06965e981687b929dd0d8431a5426883.webp)
4.3 设置单元格边框样式
python
from openpyxl.styles import Side, Border
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['F4'] = '效果1'
sheet['F5'] = '效果2'
s1 = Side(style='thin', color='8470FF')
s2 = Side(style='double', color='ff0000')
# 只作用上边框
sheet['F4'].border = Border(top=s1)
sheet['F5'].border = Border(top=s2, bottom=s1, left=s2, right=s1)
wb.save('./styles.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/2fde6f10bb6831621bf6641ebfd6c1fb.webp)
4.4 单元格对齐方式
![](https://file.jishuzhan.net/article/1771112152325689346/b66e0cb3a2d2ea0f9f86105cdd4a9d26.webp)
python
from openpyxl.styles import Alignment
import openpyxl
wb = openpyxl.load_workbook('./cellBorder.xlsx')
sheet = wb['Sheet1']
# horizontal代表水平对齐 vertical代表垂直对齐
c1 = sheet['C1'].alignment = Alignment(horizontal='right', vertical='center') # 水平靠右对齐 垂直居中对齐
c2 = sheet['C2'].alignment = Alignment(vertical='center')
c3 = sheet['C3'].alignment = Alignment(vertical='top')
wb.save('./cellBorder.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/9272006a5ad5bb78c3d77ac8857e9f66.webp)
4.5 数据筛选
全部筛选
![](https://file.jishuzhan.net/article/1771112152325689346/0f3c01b6c6ddc196f250a7bbcc6562ef.webp)
python
import openpyxl
wb = openpyxl.load_workbook('./筛选器.xlsx')
sheet = wb['Sheet1']
# 创建筛选器对象:auto_filter
# ref:使得筛选器对象引用指定的区域
sheet.auto_filter.ref = 'A1:D7'
wb.save('./筛选器.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/5385a31a2907c733b47393dc5a62fef8.webp)
设置筛选条件
python
import openpyxl
wb = openpyxl.load_workbook('./筛选器.xlsx')
sheet = wb['Sheet1']
# 创建筛选器对象:auto_filter
# ref:使得筛选器对象引用指定的区域
sheet.auto_filter.ref = 'A1:D7'
# add_filter_column参数:参数1表示对指定区域哪一列进行设置筛选条件,参数2:筛选条件内容
sheet.auto_filter.add_filter_column(1, ['北京', '深圳'])
wb.save('./筛选器.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/3682cba44d7d72731fd76a5915437fd9.webp)
排序
python
import openpyxl
wb = openpyxl.load_workbook('./筛选器.xlsx')
sheet = wb['Sheet1']
# 创建筛选器对象:auto_filter
# ref:使得筛选器对象引用指定的区域
sheet.auto_filter.ref = 'A1:D7'
# 参数1:排序列 参数2:升降序 True为降序 false为升序
sheet.auto_filter.add_sort_condition(ref='D2:D7', descending=True)
wb.save('./筛选器.xlsx')
五、公式操作
5.1 设置公式
python
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['A1'] = 200
sheet['A2'] = 300
sheet['A3'] = '=SUM(A1:A2)'
wb.save('./sum.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/65ff72ac96fe58082bf075d94c78f79f.webp)
5.2 读取公式结果
python
import openpyxl
wb = openpyxl.load_workbook('./sum.xlsx')
sheet = wb.active
print(sheet['A3'].value) # =SUM(A1:A2)
这个结果居然是读取到了公式字符串,但我们想要的是公式计算的结果,也就是A3的结果,如何解决呢?
python
import openpyxl
wb = openpyxl.load_workbook('./sum.xlsx', read_only=True)
sheet = wb.active
# 注意:如果返回的是None,则打开Excel工作簿,将内容手动保存下即可,不方便但是没办法
print(sheet['A3'].value)
六、设置行高列宽
设置行高和列宽:Worksheet对象有 row_dimensions 和 column_dimensions属性,控制行高和列宽。
python
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
# 设置行高
sheet.row_dimensions[2].height = 50
# 设置列宽
sheet.column_dimensions['A'].width = 80
wb.save('./hw.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/126967608c71b1cd541c1198198b9a17.webp)
七、单元格合并与拆分
7.1 合并
python
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
# 合并
sheet.merge_cells('A1:D7')
sheet['A1'] = 'Python'
wb.save('./merge.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/109ad3ae860bb0ca1ba0b651da01ac14.webp)
7.2 拆分
python
import openpyxl
wb = openpyxl.load_workbook('./merge.xlsx')
sheet = wb.active
# 拆分
sheet.unmerge_cells('A1:D7')
wb.save('./merge.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/6839b4ee988e011da12b87442726793f.webp)
八、冻结窗口
8.1 冻结
python
import openpyxl
wb = openpyxl.load_workbook('./produceSales.xlsx')
sheet = wb.active
# 冻结首行标题
sheet.freeze_panes = 'A2'
wb.save('./produceSales.xlsx')
8.2 解冻
python
import openpyxl
wb = openpyxl.load_workbook('./produceSales.xlsx')
sheet = wb.active
# 冻结首行标题
sheet.freeze_panes = None
wb.save('./produceSales.xlsx')
九、绘制图表
openpyxl支持利用工作表中单元格的数据,创建条形图、折线图、散点图和饼图。要创建图表,需要做下列事情:
- 创建一个Reference对象,表示作用在图表中的数据区域
- 创建图表对象
- 往图表对象中添加数据
- 将图表添加到指定sheet中
![](https://file.jishuzhan.net/article/1771112152325689346/cd715e3a028bb2278ac61aecc8c0126a.webp)
python
import openpyxl
wb = openpyxl.load_workbook('./echarts.xlsx')
sheet = wb.active
# 1. 创建一个Reference对象,表示作用在图表中的数据区域
values = openpyxl.chart.Reference(sheet, min_row=1, min_col=1, max_row=10, max_col=5)
# 2. 创建图表对象
chart = openpyxl.chart.BarChart()
# 3. 往图表对象中添加数据
chart.add_data(values)
# 4. 将图表添加到指定sheet中
sheet.add_chart(chart, 'G1')
wb.save('./echarts.xlsx')
![](https://file.jishuzhan.net/article/1771112152325689346/32c9b482b7a8bb6d7ccbb5640a389dc5.webp)