python读取Excel文档

本章的例子将使用一个电子表格 example.xlsx,它保存在根文件夹中。你可以 自己创建这个电子文档,或从 http://nostarch.com/automatestuff/下载。图 12-1 展示了 3 个默认的表,名为 Sheet1、Sheet2 和 Sheet3,这是 Excel 自动为新工作簿提供的 (不同操作系统和电子表格程序,提供的默认表个数可能会不同)。 

示例文件中的 Sheet 1 应该看起来像表 12-1(如果你没有从网站下载 example.xlsx, 就应该在工作表中自己输入这些数据)。

既然有了示例电子表格,就来看看如何用 openpyxl 模块来操作它。 

用 openpyxl 模块打开 Excel 文档 

在导入 openpyxl 模块后,就可以使用 openpyxl.load_workbook()函数。在交互式 环境中输入以下代码: 

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> type(wb) 
<class 'openpyxl.workbook.workbook.Workbook'> 

openpyxl.load_workbook()函数接受文件名,返回一个 workbook 数据类型的值。这 个workbook 对象代表这个 Excel 文件,有点类似 File 对象代表一个打开的文本文件。 要记住,example.xlsx 需要在当前工作目录,你才能处理它。可以导入 os,使 用函数 os.getcwd()弄清楚当前工作目录是什么,并使用 os.chdir()改变当前工作目录。

从工作簿中取得工作表 

调用 get_sheet_names()方法可以取得工作簿中所有表名的列表。在交互式环境中 输入以下代码: 

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'Sheet3'] 
>>> sheet = wb['Sheet3'] 
>>> sheet 
<Worksheet "Sheet3"> 
>>> type(sheet) 
<class 'openpyxl.worksheet.worksheet.Worksheet'> 
>>> sheet.title 
'Sheet3' 
>>> anotherSheet = wb.active
>>> anotherSheet 
<Worksheet "Sheet1"> 
 

每个表由一个 Worksheet 对象表示,可以通过sheetnames属性获得。最后,可以调用 Workbook 对象的active属性,取得 工作簿的活动表。活动表是工作簿在Excel 中打开时出现的工作表。在取得 Worksheet 对象后,可以通过 title 属性取得它的名称。 

从表中取得单元格 

有了 Worksheet 对象后,就可以按名字访问 Cell 对象。在交互式环境中输入以 下代码: 

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> sheet = wb['Sheet1'] 
>>> sheet['A1'] 
<Cell Sheet1.A1> 
>>> sheet['A1'].value 
datetime.datetime(2015, 4, 5, 13, 34, 2) 
>>> c = sheet['B1'] 
>>> c.value 
'Apples' 
>>> 'Row ' + str(c.row) + ', Column ' + c.column + ' is ' + c.value 
'Row 1, Column B is Apples' 
>>> 'Cell ' + c.coordinate + ' is ' + c.value 
'Cell B1 is Apples' 
>>> sheet['C1'].value 
73 
 

Cell 对象有一个 value 属性,不出意外,它包含这个单元格中保存的值。Cell 对 象也有 row、column 和 coordinate 属性,提供该单元格的位置信息。 这里,访问单元格 B1 的 Cell 对象的 value 属性,我们得到字符串'Apples'。row 属性给出的是整数 1,column 属性给出的是'B',coordinate 属性给出的是'B1'。 openpyxl 模块将自动解释列 A 中的日期,将它们返回为 datetime 值,而不是字 符串。datetime 数据类型将在第 16 章中进一步解释。 用字母来指定列,这在程序中可能有点奇怪,特别是在 Z 列之后,列开时使用 两个字母:AA、AB、AC 等。作为替代,在调用表的 cell()方法时,可以传入整数 作为 row 和 column 关键字参数,也可以得到一个单元格。第一行或第一列的整数 是 1,不是 0。输入以下代码,继续交互式环境的例子: 

>>> sheet.cell(row=1, column=2) 
<Cell Sheet1.B1> 
>>> sheet.cell(row=1, column=2).value 
'Apples' 
>>> for i in range(1, 8, 2):         
...    print(i, sheet.cell(row=i, column=2).value) 
...
1 Apples 
3 Pears 
5 Apples 
7 Strawberries 

可以看到,使用表的 cell()方法,传入 row=1 和 column=2,将得到单元格 B1的 Cell 对象,就像指定 sheet['B1']一样。然后,利用 cell()方法和它的关键字参数, 就可以编写 for 循环,打印出一系列单元格的值。 假定你想顺着 B列,打印出所有奇数行单元格的值。通过传入 2作为 range()函数 的“步长”参数,可以取得每隔一行的单元格(在这里就是所有奇数行)。for 循环 的 i 变量被传递作为 cell()方法的 row 关键字参数,而 column 关键字参数总是取 2。 请注意传入的是整数 2,而不是字符串'B'。 可以通过 Worksheet 对象的 max_row和 max_column属性,确定 表的大小。在交互式环境中输入以下代码:

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> sheet = wb['Sheet1'] 
>>> sheet.max_row
7 
>>> sheet.max_column 
3 

请注意,max_column返回一个整数,而不是 Excel 中出现的字母。 

列字母和数字之间的转换 

要从字母转换到数字,就调用 openpyxl.utils.column_index_from_string()函数。 要从数字转换到字母,就调用 openpyxl.utils.get_column_letter()函数。在交互式环境 中输入以下代码:

>>> import openpyxl 
>>> from openpyxl.utils import get_column_letter, column_index_from_string 
>>> get_column_letter(1) 
'A' 
>>> get_column_letter(2) 
'B' 
>>> get_column_letter(27) 
'AA' 
>>> get_column_letter(900) 
'AHP' 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> sheet = wb['Sheet1'] 
>>> get_column_letter(sheet.max_column) 
'C' 
>>> column_index_from_string('A') 
1 
>>> column_index_from_string('AA') 
27 
 

在从 openpyxl.utils 模块引入这两个函数后,可以调用 get_column_letter(),传入 像27 这样的整数,弄清楚第 27 列的字母是什么。函数 column_index_string()做的事情 相反:传入一列的字母名称,它告诉你该列的数字是什么。要使用这些函数,不必 加载一个工作簿。如果你愿意,可以加载一个工作簿,取得 Worksheet 对象,并调 用 Worksheet 对象的属性如:max_column,来取得一个整数。然后,将该整数传递给 get_column_letter()。 

从表中取得行和列 

可以将 Worksheet 对象切片,取得电子表格中一行、一列或一个矩形区域中的所有 Cell 对象。然后可以循环遍历这个切片中的所有单元格。在交互式环境中输入以下代码:

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> sheet = wb['Sheet1']
>>> tuple(sheet['A1':'C3']) 
((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>), (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>), (<Cell Sheet1.A3>, <Cell Sheet1.B3>, <Cell Sheet1.C3>))
>>> for rowOfCellObjects in sheet['A1':'C3']:         
...    for cellObj in rowOfCellObjects:             
...        print(cellObj.coordinate, cellObj.value)         
...    print('--- END OF ROW ---') 
...
A1 2015-04-05 13:34:02 
B1 Apples 
C1 73 
--- END OF ROW --- 
A2 2015-04-05 03:41:23 
B2 Cherries 
C2 85 
--- END OF ROW --- 
A3 2015-04-06 12:46:51 
B3 Pears 
C3 14 
--- END OF ROW --- 

这里,我们指明需要从 A1 到C3 的矩形区域中的 Cell 对象,得到了一个 Generator 对象,它包含该区域中的 Cell 对象。为了帮助我们看清楚这个 Generator 对象,可以 使用它的 tuple()方法,在一个元组中列出它的 Cell 对象。 这个元组包含 3 个元组:每个元组代表 1 行,从指定区域的顶部到底部。这 3 个内部元组中的每一个包含指定区域中一行的 Cell 对象,从最左边的单元格到最右 边。所以总的来说,工作表的这个切片包含了从 A1 到 C3 区域的所有 Cell 对象, 从左上角的单元格开始,到右下角的单元格结束。 要打印出这个区域中所有单元格的值,我们使用两个 for 循环。外层 for 循环遍历 这个切片中的每一行。然后针对每一行,内层 for 循环遍历该行中的每个单元格。

要访问特定行或列的单元格的值,也可以利用 Worksheet 对象的iter_rows和iter_cols方法。在交互式环境中输入以下代码:

>>> import openpyxl 
>>> wb = openpyxl.load_workbook('example.xlsx') 
>>> sheet = wb.active 
>>> tuple(sheet.iter_cols(min_col=2, max_col=2))
((<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>, 
<Cell 'Sheet1'.B5>, <Cell 'Sheet1'.B6>, <Cell 'Sheet1'.B7>),)
>>> for cellObj in sheet.iter_cols(min_col=2, max_col=2):
...    for cell in cellObj:
...        print(cell.value)
...
Apples
Cherries
Pears
Oranges
Apples
Bananas
Strawberries

 工作簿、工作表、单元格

作为快速复习,下面是从电子表格文件中读取单元格涉及的所有函数、方法和 数据类型。

1.导入 openpyxl 模块。

2.调用 openpyxl.load_workbook()函数。

3.取得 Workbook 对象。

4.调用 sheet.active或 sheet['sheetname']。

5.取得 Worksheet 对象。

6.使用索引或工作表的 cell()方法,带上 row 和 column 关键字参数。

7.取得 Cell 对象。

8.读取 Cell 对象的 value 属性。 


 

猜你喜欢

转载自blog.csdn.net/dongyu1703/article/details/82263242