openpyxl 用于读取/写入Excel 的 Python库

我这里学习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
  1. 保存到文件
    保存工作簿的最简单,最安全的方法是使用对象的 Workbook.save() 方法:
wb.save('test.xlsx')

此操作将覆盖现有文件,而不会发出警告。

  1. 保存到流
    如果要将文件保存到流中,例如在使用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')

你可能感兴趣的:(openpyxl 用于读取/写入Excel 的 Python库)