@zhangyu756897669
2017-09-24T15:46:23.000000Z
字数 5194
阅读 599
python官方文档
Excel是Windows的流行和强大的电子表格应用程序。 openpyxl模块允许您的Python程序读取和修改Excel电子表格文件。例如,您可能无法从一个电子表格复制某些数据并将其粘贴到另一个电子表格中。或者您可能需要经过数千行,并根据一些标准选择少数几个进行小编辑。或者您可能需要查看数百个部门预算的电子表格,寻找任何红色的电子表格。这些正是Python可以为您做的无聊,无心的电子表格任务
虽然Excel是Microsoft的专有软件,但是在Windows,OS X和Linux上运行的是免费的替代方案。 LibreOffice Calc和OpenOffice Calc都可以使用Excel的.xlsx文件格式的电子表格,这意味着openpyxl模块也可以在这些应用程序的电子表格上工作。您可以分别从https://www.libreoffice.org/和http://www.openoffice.org/下载软件。即使您的计算机上已经安装了Excel,也可能会发现这些程序更易于使用。但是,本章中的屏幕截图都来自Windows 7上的Excel 2010。
首先,我们来看一些基本的定义:Excel电子表格文档被称为工作簿。单个工作簿将保存在.xlsx扩展名的文件中。每个工作簿可以包含多个工作表(也称为工作表)。用户当前是vieExcel文档的工作表
每张表都有列(以A开头的字母寻址)和行(以1开头编号)。特定列和行中的框称为单元格。每个单元格可以包含数字或文本值。具有数据的单元格网格构成了一张表格。
Python不会与OpenPyXL一起使用,所以你必须安装它。按照附录A中安装第三方模块的说明进行操作;该模块的名称是openpyxl。
import openpyxl
如果模块安装正确,则不会产生错误信息。记住在本章中运行交互式shell示例之前导入openpyxl模块,否则您将收到一个NameError:name'openpyxl'未定义错误。
本书涵盖了OpenPyXL的2.3.3版本,但OpenPyXL团队定期发布新版本。不用担心,新版本应该保持向后兼容本书中的说明相当一段时间。如果您有一个较新的版本,并希望看到您可以使用哪些其他功能,您可以在http://openpyxl.readthedocs.org/上查看OpenPyXL的完整文档。
本章中的示例将使用根文件夹中存储的名为example.xlsx的电子表格。您可以自己创建电子表格或从中下载 http://nostarch.com/automatestuff/. Figure 12-1 显示Excel自动为新工作簿提供的三个默认工作表Sheet1,Sheet2和Sheet3的选项卡。 (创建的默认工作表数可能因操作系统和电子表格程序而异)。
图一
示例文件中的Sheet 1应如表2所示。
图二
现在我们有我们的示例电子表格,我们来看看我们如何用openpyxl模块来处理它。
导入openpyxl模块后,您将可以使用openpyxl.load_workbook()函数
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
type(wb)
openpyxl.workbook.workbook.Workbook
openpyxl.load_workbook()函数接收文件名并返回工作簿数据类型的值。此Workbook对象表示Excel文件,有点像File对象表示打开的文本文件。
请记住,example.xlsx需要在当前工作目录中才能使用它。您可以通过导入os并使用os.getcwd()了解当前工作目录,您可以使用os.chdir()更改当前工作目录。
您可以通过调用get_sheet_names()方法获取工作簿中所有工作表名称的列表。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
sheet = wb.get_sheet_by_name('Sheet3')
sheet
anotherSheet = wb.active
anotherSheet
每个工作表都由Worksheet对象表示,您可以通过将工作表名称字符串传递给get_sheet_by_name()工作簿方法来获取。最后,您可以读取Workbook对象的活动成员变量以获取工作簿的活动工作表。活动工作表是在Excel中打开工作簿时的顶部工作表。一旦你有了Worksheet对象,你可以从title属性中获取它的名字。
一旦你有一个Worksheet对象,你可以访问一个单元格对象的名称。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sheet['A1']
sheet['A1'].value
'4/5/2015 1:34:02 PM'
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 属性包含,value储存在该单元格中,Cell 对象 also have row, column,coordinate 为单元格提供位置信息的属性。
访问 value的属性 Cell, 返回单元格B1字符串 'Apples';row(行)属性给我们整数1, column(列)属性给我们'B',coordinate(坐标)属性给我们'B1'。
OpenPyXL将自动解释列A中的日期,并将其作为日期时间值而不是字符串返回。 datetime数据类型在第16章进一步说明。
通过字母指定列可能难以编程,特别是因为在列Z之后,列以两个字母开头:AA,AB,AC等等。或者,您还可以使用工作表的cell()方法获取单元格,并为其行和列关键字参数传递整数。第一行或列的整数为1,而不是0.
sheet.cell(row=1, column=2)
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的单元格对象,就像指定表['B1']一样。然后,使用cell()方法及其关键字参数,您可以编写一个for循环来打印一系列单元格的值。
假设你想下一列B,并打印每个单元格中奇数行号的值。通过对range()函数的“step”参数传递2,您可以从每个第二行(在这种情况下,所有奇数行)中获取单元格。 for循环的i变量被传递给cell()方法的row关键字参数,而对于column关键字参数总是传递2。注意,整数2,而不是字符串'B',被传递。
您可以使用Worksheet对象的max_row和max_column成员变量确定工作表的大小。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sheet.max_row
7
sheet.max_column
3
请注意,max_column方法返回一个整数,而不是Excel中显示的字母。
要将字母转换为数字,请调用openpyxl.cell.column_index_from_string()函数。要将数字转换为字母,请调用openpyxl.cell.get_column_letter()函数。
import openpyxl
try:
from openpyxl.cell import get_column_letter
except ImportError:
from openpyxl.utils import get_column_letter
try:
from openpyxl.cell import column_index_from_string
except ImportError:
from openpyxl.utils import column_index_from_string
from openpyxl.utils import get_column_letter
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.get_sheet_by_name('Sheet1')
get_column_letter(sheet.max_column)
'C'
column_index_from_string('A')
1
column_index_from_string('AA')
27
从openpyxl.cell模块导入这两个函数之后,可以调用get_column_letter()并传递一个像27的整数,以确定第27列的字母名称。函数column_index_string()反之亦然:将列的字母名称传递给它,并指示该列的数字。您不需要加载工作簿来使用这些功能。如果需要,可以加载工作簿,获取Worksheet对象,并调用像max_column这样的Worksheet对象方法来获取整数。然后,您可以将该整数传递给get_column_letter()
您可以对Worksheet对象进行切片,以获取电子表格的行,列或矩形区域中的所有Cell对象。然后你可以循环切片中的所有单元格。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('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 4/5/2015 1:34:02 PM
B1 Apples
C1 73
--- END OF ROW ---
A2 4/5/2015 3:41:23 AM
B2 Cherries
C2 85
--- END OF ROW ---
A3 4/6/2015 12:46:51 PM
B3 Pears
C3 14
--- END OF ROW ---
在这里,我们指定我们想要从A1到C3的矩形区域中的单元格对象,并且我们得到一个包含该区域中的单元格对象的生成器对象。为了帮助我们可视化这个Generator对象,我们可以使用它的tuple()来在一个元组中显示它的Cell对象。
该元组包含三个元组:每行一个,从所需区域的顶部到底部。这三个内部元组中的每一个都包含我们所需区域的一行中的单元格对象,从最左侧的单元格到右侧。因此,我们的工作表片段包含从A1到C3的区域中的所有单元格对象,从左上角的单元格开始,以右下角的单元格结尾。
要打印区域中每个单元格的值,我们使用两个for循环。外部循环遍历切片❶中的每一行。然后,对于每一行,嵌套for循环遍历该行中的每个单元格❷。
要访问特定行或列中单元格的值,还可以使用Worksheet对象的rows和columns属性。