Python中用OpenPyXL处理Excel表格
新建Excel表格
新建Excel表格,默认有一个名为 Sheet
的表格,如下:
1
|
from openpyxl import Workbook
|
打开已有的Excel表格
对已有的Excel表格进行操作,如下:
1
|
from openpyxl import Workbook, load_workbook
|
新建/获取Sheet表格
使用 Workbook.create_sheet()
方法新建Sheet表格。第一个参数是sheet名称,若不填,则默认以 Sheet1
Sheet2
Sheet3
…方式命名;第二个参数是插入Sheet表格的位置,以 0
为第一个位置,若不填,则置于最后。如下:
1
|
ws1 = wb.create_sheet("Mysheet") #默认在最后插入
|
也可以后期随时修改sheet的名字,如下:
1
|
ws.title = "New Title"
|
修改sheet标签颜色,如下:
1
|
ws.sheet_properties.tabColor = "1072BA"
|
若知道sheet的名字,可以用如下方式获取sheet :
1
|
ws = wb.get_sheet_by_name("New Title")
|
也可获取全部sheet的名字,遍历sheet名字,如下:
1
|
sheets = wb.sheetnames
|
也可以定位到相应sheet页,[0]为sheet页索引,如下:
1
|
sheet_names = wb.sheetnames # 获取所有sheet页名字
|
复制Sheet表格
仅能复制 单元格的值
样式
超链接
注释块
等,而 图片
和 表格
等是无法复制的,如下:
1
|
source = wb.active
|
操作单元格
由 worksheet
获取单元格,或直接给单元格赋值,如下:
1
|
cell = ws['A4'] #获取第4行第A列的单元格
|
获取区域内的单元格,如下:
1
|
cell_range = ws['A1':'C2'] #获取A1-C2内的区域
|
如果得到单元格,可以赋值,如下:
1
|
cell.value = 'hello, world'
|
获取单元格的值,如下:
1
|
cellValue = ws.cell(row=i, column=j).value
|
获取行列数,如下:
1
|
row = ws.max_row #最大行数
|
一行行的获取数据,如下:
1
|
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
|
一列列的获取数据,如下:
1
|
>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
|
因为性能的原因, Worksheet.iter_cols()
方法不能在只读模式下使用。
获取所有的列或行,如下:
1
|
rows = ws.rows
|
因为性能的原因, Worksheet.columns
方法不能在只读模式下使用。
如果只想从worksheet中获取值,可以使用 Worksheet.values
属性,如下:
1
|
for row in ws.values:
|
Worksheet.iter_rows()
和 Worksheet.iter_cols()
方法都可以添加 values_only
参数来达到仅获取值的目的,如下:
1
|
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
|
保存文件
使用 Workbook.save()
方法保存workbook,这个方法会不加提示的覆盖原文件,如下:
1
|
wb = Workbook()
|
获取单元格类型
1
|
from openpyxl import Workbook, load_workbook
|
使用公式
1
|
from openpyxl import Workbook, load_workbook
|
合并单元格
1
|
from openpyxl import Workbook, load_workbook
|
插入一个图片
需要 pillow
库,安装如下:
1
|
pip install pillow
|
1
|
from openpyxl import load_workbook
|
隐藏单元格
1
|
from openpyxl import load_workbook
|
优化模式
在处理非常大的 XLSX
文件时,openpyxl
的常规模式无法处理这种负载。幸运的是,有两种模式可以在(几乎)恒定内存消耗的情况下读写无限量的数据。
只读模式
1
|
from openpyxl import load_workbook
|
只写模式
1
|
from openpyxl import Workbook
|
- 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用
create_sheet()
方法专门创建工作表。 - 在只写的工作簿中,只能使用
append()
添加行。使用cell()
或iter_rows()
在任意位置写(或读)单元格是不可能的。 - 它能够导出无限数量的数据(甚至比Excel实际能够处理的更多),同时将内存使用量保持在10Mb以下。
插入/删除行/列,移动区域单元格
插入行/列
在第7行之上插入一行,如下:
1
|
ws.insert_rows(7)
|
在第7列的左边插入一列,如下:
1
|
ws.insert_cols(7)
|
删除行/列
从第6列开始,删除3列,即删除6、7、8列,如下:
1
|
ws.delete_cols(6, 3)
|
移动区域单元格
将 D4:F10
区域向上移动一行向右移动2列,如下:
1
|
ws.move_range("D4:F10", rows=-1, cols=2)
|
如果区域内包含 公式
,则如下方法可以连同公式一起挪动:
1
|
ws.move_range("G4:H10", rows=1, cols=1, translate=True)
|
使用 Pandas 和 NumPy
详情请移步 Working with Pandas and NumPy
图表
图表由至少一个系列的一个或多个单元格区域数据点组成。更多内容请移步 图表介绍
注释
openpyxl
可读/写注释,但格式信息会被丢失。在 只读模式
下不支持操作注释。注释必须包括 内容
和 作者
。
读注释,如下:
1
|
comment = ws["A1"].comment
|
写注释,如下:
1
|
comment = Comment("Text", "Author")
|
表格样式
字体样式
字体名称、字体大小、字体颜色、加粗、斜体、纵向对齐方式(有三种:baseline
,superscript
, subscript
)、下划线、删除线,如下:
1
|
from openpyxl.styles import Font
|
字体颜色可以用 RGB
或 aRGB
,如下:
1
|
font = Font(color="FFBB00")
|
继承并重写样式,如下:
1
|
ft1 = Font(name='Arial', size=14)
|
填充样式
详情请移步 填充样式
1
|
from openpyxl.styles import PatternFill
|
边框样式
详情请移步 边框样式
1
|
from openpyxl.styles import Border, Side
|
对齐样式
horizontal 的值有:distributed
, justify
, center
, left
, fill
, centerContinuous
, right
, general
vertical 的值有:bottom
, distributed
, justify
, center
, top
1
|
from openpyxl.styles import Alignment
|
保护样式
锁定、隐藏
1
|
from openpyxl.styles import Protection
|
整行或整列应用样式
1
|
col = ws.column_dimensions['A']
|
更改合并的单元格样式
合并的单元格可以想想成为左上角的那个单元格来操作。
筛选和排序
1
|
from openpyxl import Workbook
|
生成的Excel表格,有筛选排序的操作,但是没有实际表现出效果,如下图:
需要手动点击 重写应用
才能显示出效果,如下图:
密码保护
该功能仅能提供一个很基础的密码保护,没有进行加密处理,网上普通的破解软件都可以破解密码。不过,日常使用还是可以的。
该功能仅可用于新建excel表格,不能用于已存在的excel表格。
workbook工作薄保护
防止查看隐藏sheet,避免增加、移动、删除、隐藏或重命名sheet等操作,可以保护workbook的结构,如下:
1
|
wb.security.workbookPassword = '...'
|
worksheet保护
worksheet保护不需要密码,如下:
1
|
ws = wb.active
|