python包-openpyxl

openpyxl 是一个处理 excel 的 python 包,但是相比于 pandas ,除了速度上可能有优势外,个人感觉没有 pandas 更好用。

创建工作簿

这里我们可以直接使用这个包来创建一个 excel 文件,只需要导入 workbook

1
2
3
In [1]: from openpyxl import Workbook

In [2]: wb = Workbook()

一个工作簿至少有一个工作表 (worksheet)。你可以使用 workbook.active 的属性来得到一个工作表,使用这种方法得到的是第一个工作表。

1
In [3]: ws = wb.active

你可以使用 Workbook.create_sheet() 方法来创建新的工作表

1
2
3
4
5
In [4]: >>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)
...: # or
...: >>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
...: # or
...: >>> ws3 = wb.create_sheet("Mysheet", -1) # insert at the penultimate position

默认创建的sheet 表的名称为 Sheet, Sheet1, Sheet2, …,你可以通过 Worksheet.title 属性来随时修改名称

1
In [7]: ws.title = "New Title"

一旦你给了工作表一个名称,你就可以通过名称得到这个工作表

1
In [8]: ws3 = wb["New Title"]

你可以通过 Workbook.sheetnames 属性得到工作簿中所有表格的名称

1
2
In [9]: print(wb.sheetnames)
['Mysheet1', 'New Title', 'Mysheet2', 'Mysheet']

你可以使用 for 循环遍历所有的表格

1
2
3
4
5
6
7
In [10]: >>> for sheet in wb:
...: ... print(sheet.title)
...:
Mysheet1
New Title
Mysheet2
Mysheet

你可以在一个工作簿中复制一个表格,使用 Workbook.copy_worksheet() 方法

1
2
In [11]: >>> source = wb.active
...: >>> target = wb.copy_worksheet(source)

处理数据

获取一个单元格

一旦得到了一个表格,我们可以直接获取或修改某个单元格的值

1
2
3
4
In [12]: >>> c = ws['A4']
...: >>> ws['A4'] = 4
...:

更普遍地,我们可以使用 Worksheet.cell() 通过行号和列号来获取某个单元格, value 参数用于赋值

1
>>> d = ws.cell(row=4, column=2, value=10)

当一个工作表只在内存中创建时,此时它没有任何单元格,因此第一次获取这个单元格就会创建这个单元格。因此类似下面的代码,就可以在内存中创建 100 乘 100 的空的单元格。

1
2
3
4
5
In [18]: >>> for x in range(1,101):
...: ... for y in range(1,101):
...: ... ws.cell(row=x, column=y)
...:

获取很多单元格

可以使用下面的切片获得一个区域

1
2
In [19]: >>> cell_range = ws['A1':'C2']
...:

行或列的切片如下

1
2
3
4
In [20]: >>> colC = ws['C']
...: >>> col_range = ws['C:D']
...: >>> row10 = ws[10]
...: >>> row_range = ws[5:10]

你也可以使用 Worksheet.iter_rows() 方法

1
2
3
4
5
6
7
8
9
10
11
In [21]: >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...: ... for cell in row:
...: ... print(cell)
...:
<Cell 'New Title'.A1>
<Cell 'New Title'.B1>
<Cell 'New Title'.C1>
<Cell 'New Title'.A2>
<Cell 'New Title'.B2>
<Cell 'New Title'.C2>

类似地, Worksheet.iter_cols() 会返回列,但是这个方法在可读模式中不可用。

1
2
3
4
5
6
7
8
9
10
11
In [22]: >>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
...: ... for cell in col:
...: ... print(cell)
...:
<Cell 'New Title'.A1>
<Cell 'New Title'.A2>
<Cell 'New Title'.B1>
<Cell 'New Title'.B2>
<Cell 'New Title'.C1>
<Cell 'New Title'.C2>

如果你需要迭代一个表格的所有行,你可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [23]: >>> ws = wb.active
...: >>> ws['C9'] = 'hello world'
...: >>> tuple(ws.rows)
Out[23]:
((<Cell 'Mysheet1'.A1>, <Cell 'Mysheet1'.B1>, <Cell 'Mysheet1'.C1>),
(<Cell 'Mysheet1'.A2>, <Cell 'Mysheet1'.B2>, <Cell 'Mysheet1'.C2>),
(<Cell 'Mysheet1'.A3>, <Cell 'Mysheet1'.B3>, <Cell 'Mysheet1'.C3>),
(<Cell 'Mysheet1'.A4>, <Cell 'Mysheet1'.B4>, <Cell 'Mysheet1'.C4>),
(<Cell 'Mysheet1'.A5>, <Cell 'Mysheet1'.B5>, <Cell 'Mysheet1'.C5>),
(<Cell 'Mysheet1'.A6>, <Cell 'Mysheet1'.B6>, <Cell 'Mysheet1'.C6>),
(<Cell 'Mysheet1'.A7>, <Cell 'Mysheet1'.B7>, <Cell 'Mysheet1'.C7>),
(<Cell 'Mysheet1'.A8>, <Cell 'Mysheet1'.B8>, <Cell 'Mysheet1'.C8>),
(<Cell 'Mysheet1'.A9>, <Cell 'Mysheet1'.B9>, <Cell 'Mysheet1'.C9>))

Worksheet.columns 属性。

只获取值

如果你只想要获得一个表格中的值,你可以使用 Worksheet.values 属性。它会迭代一个表格中的所有的行,但是只会返回表格的值 (这才是目的)

1
2
3
In [24]: for row in ws.values:
...: for value in row:
...: print(value)

Worksheet.iter_rows()Worksheet.iter_cols() 也可以通过 values_only 参数来返回单元格的值

1
2
3
4
5
In [25]: >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
...: ... print(row)
...:
(None, None, None)
(None, None, None)

追加 (append)

append是按行向Excel中追加数据,从当前行的下一行开始追加。默认从第1行开始,如果想要从指定的行开始需要通过sheet._current_row =row_num设置。

输入数据类型可以是列表,元组和字典。

列表和元组的作用是一样的,第一个元素对应插入行 A1 列的元素,以此类推。

字典的话,键必须是 1234 或者 “A”,“B”,“C” ,对应列号;值必须是单个元素,对应单元格的值。

1
2
3
4
5
6
7
from openpyxl import Workbook
wb=Workbook()
ws=wb.create_sheet('hello')
ws._current_row=20
# 将当前行指定在20行
ws.append([1,2,3,4])
# 1,2,3,4将会插入到21行,的第A,B,C,D列

数据存储

一旦你获得了一个单元格,你可以分配一个值。

1
2
3
4
5
6
7
In [26]: >>> c.value = 'hello, world'
...: >>> print(c.value)
...: 'hello, world'
...:
...: >>> d.value = 3.14
...: >>> print(d.value)
...: 3.14

保存为文件

使用 Workbook.save() 方法来保存文件,注意这会覆盖旧文件

1
2
>>> wb = Workbook()
>>> wb.save('balances.xlsx')

导入文件

使用 openpyxl.load_workbook() 来打开一个 excel 文件

1
2
3
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print(wb2.sheetnames)

文献

  1. https://openpyxl.readthedocs.io/en/stable/tutorial.html

  2. Python 处理数据(Excel)—— openpyxl 之append

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2024 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信