快速指引
用python读写excel的强大工具:openpyxl。本文只整理了openpyxl中那些使用最频繁的操作,其余的可自行搜索或查看官方文档,或者中文文档。
openpyxl安装
1 | $ pip install openpyxl |
openpyxl使用
1 | #!/usr/bin/python |
workbook级操作
1 | # 创建一个workbook对象,默认只含有一个sheet |
<openpyxl.workbook.workbook.Workbook object at 0x10966fa50>
<openpyxl.workbook.workbook.Workbook object at 0x10968ee90>
1 | # 保存Workbook |
Worksheet级操作
获取Worksheet对象
1 | # 激活第一个worksheet |
<Worksheet "Sheet"> <Worksheet "Sheet1"> <Worksheet "sheet2">
<Worksheet "Sheet1">
Sheet
Sheet1
sheet2
获取Worksheet对象的属性
1 | # 返回所有worksheets的名字 |
[u'Sheet0', u'Sheet1', u'sheet2', u'Sheet0 Copy']
Sheet0
1 1
操作Worksheet
1 | # 更改Worksheet的表名 |
Sheet0
<Worksheet "Sheet0 Copy1">
Worksheet行列操作
1 | # 在Worksheet的max_row后面追加一行数据,序列默认从第一列添加,不足则补None |
((1, 2),)
1 | # 也可传入字典,key对应了列 |
((1, 2, None), (3, None, 5))
Worksheet插入/删除行或列
1 | # 在第3行前面插入行,如果参数超出了当前范围则什么也不做 |
((None, None, None), (1, 2, None), (3, None, 5))
1 | ws.delete_rows(idx=3,amount=1) |
((None, None, None), (1, 2, None))
Cell级操作
获取Cell对象
1 | # 获取单个Cell |
<Cell u'Sheet0'.A1>
(<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.B1>, <Cell u'Sheet0'.C1>) 3
(<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.A2>, <Cell u'Sheet0'.A3>) 3
前三列 ((<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.A2>, <Cell u'Sheet0'.A3>), (<Cell u'Sheet0'.B1>, <Cell u'Sheet0'.B2>, <Cell u'Sheet0'.B3>), (<Cell u'Sheet0'.C1>, <Cell u'Sheet0'.C2>, <Cell u'Sheet0'.C3>))
前两行: ((<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.B1>, <Cell u'Sheet0'.C1>), (<Cell u'Sheet0'.A2>, <Cell u'Sheet0'.B2>, <Cell u'Sheet0'.C2>))
A1:C2: ((<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.B1>, <Cell u'Sheet0'.C1>), (<Cell u'Sheet0'.A2>, <Cell u'Sheet0'.B2>, <Cell u'Sheet0'.C2>))
遍历行/列/单元格对象
遍历用 ws.iter_rows
和 ws.iter_cols
就够了!!
1 | # 按行列号遍历每一行,带min max参数时不受已激活范围的影响 |
(<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.B1>, <Cell u'Sheet0'.C1>)
(<Cell u'Sheet0'.A2>, <Cell u'Sheet0'.B2>, <Cell u'Sheet0'.C2>)
1 | # 遍历每一列,不带min max参数时,只返回激活范围内的单元格 |
(<Cell u'Sheet0'.A1>, <Cell u'Sheet0'.A2>, <Cell u'Sheet0'.A3>)
(<Cell u'Sheet0'.B1>, <Cell u'Sheet0'.B2>, <Cell u'Sheet0'.B3>)
(<Cell u'Sheet0'.C1>, <Cell u'Sheet0'.C2>, <Cell u'Sheet0'.C3>)
1 | # 行优先遍历每个单元格,ws.iter_rows()和ws.rows效果相同,但前者可自定义参数 |
<Cell u'Sheet0'.A1>
<Cell u'Sheet0'.B1>
<Cell u'Sheet0'.C1>
<Cell u'Sheet0'.A2>
<Cell u'Sheet0'.B2>
<Cell u'Sheet0'.C2>
<Cell u'Sheet0'.A3>
<Cell u'Sheet0'.B3>
<Cell u'Sheet0'.C3>
1 | # 遍历区域 |
<Cell u'Sheet0'.A1>
<Cell u'Sheet0'.B1>
<Cell u'Sheet0'.C1>
<Cell u'Sheet0'.A2>
<Cell u'Sheet0'.B2>
<Cell u'Sheet0'.C2>
1 | # 遍历值 |
(None, None)
(1, 2)
(None, None)
获取单元格的属性
1 | cell = ws['A1'] |
None
修改Cell的属性
修改单元格的值
1 | # 修改单元格的值 |
0
((3, 3, 3), (3, 3, 3), (3, 3, 3))
修改单元格的格式
1 | 单元格的默认属性: |
1 | from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font |
1 | # 以修改单元格的字体为例 |
1 | wb.save('./learn_openpyxl.xlsx') |
改进模式
有时,您需要打开或写入非常大的XLSX文件,而OpenPYXL中的常见例程将无法处理该负载。幸运的是,有两种模式使您能够以(接近)恒定的内存消耗来读写无限量的数据。
只读模式
1 | wb_read = opx.load_workbook(filename='./learn_openpyxl.xlsx', read_only=True) |
<openpyxl.workbook.workbook.Workbook at 0x1096f4110>
1 | ws_read = wb_read.active |
3 3
1 | for row in ws_read.iter_rows(values_only=True): |
(9999L, 3L, 3L)
(3L, 3L, 3L)
(3L, 3L, 3L)
1 | wb_read.close() |
<openpyxl.workbook.workbook.Workbook at 0x1096f4110>
只写模式
- 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用 create_sheet() 方法。
- 在只写工作簿中,只能使用 append() . 不能在任意位置用 cell() 或 iter_rows() .
- 它能够导出无限量的数据(甚至超过了Excel的实际处理能力),同时将内存使用量保持在10MB以下。
- 只写工作簿只能保存一次。之后,每次试图将工作簿或append()保存到现有工作表时,都会引发 openpyxl.utils.exceptions.WorkbookAlreadySaved 例外。
- 在添加单元格之前,必须创建实际单元格数据之前出现在文件中的所有内容,因为在此之前必须将其写入文件。例如, freeze_panes 应在添加单元格之前设置。
1 | # load_workbook本地读取的Excel没有只写权限 |
<openpyxl.workbook.workbook.Workbook at 0x1096cba10>
1 | # 只写模式的Workbook创建后,没有sheet,需要手动创建 |
[]
<WriteOnlyWorksheet "Sheet">
1 | # 只写模式的worksheet没有cell属性,也不能通过索引来获取单元格 |
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-39-5164431d4a6c> in <module>()
1 # 只写模式的worksheet没有cell属性,也不能通过索引来获取单元格
----> 2 ws_write.cell
AttributeError: 'WriteOnlyWorksheet' object has no attribute 'cell'
1 | ws_write.append([1,2,3]) |
1 | # 如果希望为单元格添加格式或注释,可以使用WriteOnlyCell |
1 | wb_write.save('./write_only.xlsx') |