我这里学习openpyxl
的原因是,xlwt
库(一个excel写入库) 无法实现 读取模版文件(有一定的模版内容),进行修改,并将修改后的内容保存到新的sheet表(原模版sheet保持不变)。 使用copy_worksheet
功能。
安装
pip3 install openpyxl
为了能够将图像(jpeg,png,bmp等)包含到openpyxl
文件中,您还需要安装pillow
库(非必须):
pip3 install pillow
开始教程
1. 创建一个工作簿(在内存中创建,可以理解为内存中的excel文件对象)
In [1]: from openpyxl import Workbook
...: wb = Workbook()
2. 创建一个工作表sheet
注意:第一次创建完 Workbook
后默认会有一个名为Sheet 的工作表。
获取这个工作表
ws = wb.active
使用 Workbook.create_sheet(title: str=None, index: int=None)
方法创建新的工作表
title:sheet的名字
index:sheet在excel的位置,默认最后一个
# 默认位置在最后一个
In [2]: ws1 = wb.create_sheet("Mysheet1")
# 在第一个
In [3]: ws2 = wb.create_sheet("Mysheet2", 0)
# 在倒数第二个
In [4]: ws3 = wb.create_sheet("Mysheet3", -1)
sheet 创建时会自动为其命名。它们按顺序编号(Sheet,Sheet1,Sheet2等)。您可以随时通过 Worksheet.title
属性更改此名称:
# 将名字由 'Mysheet1' 改成 'New Title'
ws1.title = "New Title"
默认情况下,包含该标题的选项卡的背景颜色为白色。您可以更改此属性RRGGBB
,为Worksheet.sheet_properties.tabColor属性提供颜色代码 :
ws.sheet_properties.tabColor = "1072BA"
给工作表(sheet)命名后,就可以将其作为工作簿(Workbook)的键,来获取指定sheet:
new_title = wb["New Title"]
您可以使用 Workbook.sheetname
属性查看工作簿中所有工作表的名称
In [24]: wb.sheetnames
Out[24]: ['Mysheet2', 'Sheet', 'Mysheet3', 'New Title']
3. 遍历工作表
In [25]: for sheet in wb:
...: print(sheet)
...:
4. 在单个工作簿中创建工作表的副本
copy_worksheet(from_worksheet)
from_worksheet:复制哪个工作表
In [30]: target = wb.copy_worksheet(wb["New Title"])
In [31]: target
Out[31]:
注意:
仅复制单元格(包括值,样式,超链接和注释)和某些工作表属性(包括尺寸,格式和属性)。不复制所有其他工作簿/工作表属性-例如图像,图表。
您也不能在工作簿之间复制工作表。如果工作簿以只读或仅写 模式打开,则不能复制工作表。
5. 访问一个单元
单元格可以直接作为工作表的键进行访问:
In [34]: c = ws['A4']
In [35]: c
Out[35]:
|
这将返回A4处的单元格,或者如果尚未存在则创建一个单元格。可以直接分配值:
In [36]: ws['A4'] = 4
Worksheet.cell()
方法可以使用行和列表示法访问单元格:
In [38]: d = ws.cell(row=4, column=2, value=10)
In [39]: d
Out[39]:
|
在内存中创建工作表时,它不包含任何单元格。它们是在首次访问时创建的。
6. 访问多个单元
可以使用切片访问单元格范围:
In [40]: cell_range = ws['A1':'C2']
In [41]: cell_range
Out[41]:
((, , ),
(, , ))
| | | | | |
行或列的范围可以类似地获得:
In [42]: colC = ws['C']
In [43]: colC
Out[43]: (, , , )
In [44]: col_range = ws['C:D']
In [45]: col_range
Out[45]:
((, , , ),
(, , , ))
In [46]: row10 = ws[10]
In [47]: row10
Out[47]:
(,
,
,
)
In [48]: row_range = ws[5:10]
In [49]: row_range
Out[49]:
((, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(,
,
,
))
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
您也可以使用以下Worksheet.iter_rows()
方法:
iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False):
# 1-2行,最大3列
In [50]: for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...: for cell in row:
...: print(cell)
...:
| | | | | |
同样,该Worksheet.iter_cols()
方法将返回列:
iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)
In [51]: for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
...: for cell in col:
...: print(cell)
...:
| | | | | |
如果需要遍历文件的所有行或列,则可以使用 Worksheet.rows
属性:
# 第一行,第二行,第三行 ......
In [52]: ws.rows
Out[52]:
In [53]: tuple(ws.rows)
Out[53]:
((, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(,
,
,
))
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
或 Worksheet.columns
属性:
# A列,B列,C列 ......
In [54]: tuple(ws.columns)
Out[54]:
((,
,
,
,
...
,
,
,
))
| | | | | | | |
7. 仅获取值
如果只需要工作表中的值,则可以使用该 Worksheet.values
属性。这将遍历工作表中的所有行,但仅返回单元格值:
In [55]: for row in ws.values:
...: for value in row:
...: print(value)
...:
None
...
None
4
10
None
None
...
None
None
Worksheet.iter_rows()
和Worksheet.iter_cols()
方法中也可以采用 values_only
参数,只返回单元格的值:
In [56]: 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)
8. 数据存储
一旦有了Cell,我们可以为其分配一个值:
In [61]: c.value = 'hello, world'
In [62]: c.value
Out[62]: 'hello, world'
In [63]: d.value = 3.14
In [64]: d.value
Out[64]: 3.14
- 保存到文件
保存工作簿的最简单,最安全的方法是使用对象的Workbook.save()
方法:
wb.save('test.xlsx')
此操作将覆盖现有文件,而不会发出警告。
- 保存到流
如果要将文件保存到流中,例如在使用Web应用程序(例如Pyramid,Flask或Django)时,只需提供以下命令即可 NamedTemporaryFile():
In [83]: from tempfile import NamedTemporaryFile
In [84]: with NamedTemporaryFile() as tmp:
...: wb.save(tmp.name)
...: tmp.seek(0)
...: stream = tmp.read()
...:
9. 从文件中加载数据
您可以使用openpyxl.load_workbook()
打开现有的工作簿
from openpyxl import load_workbook
wb2 = load_workbook('test.xlsx')