Python基础学习笔记(7)

《Python编程快速上手》

Python处理Excel电子表格

openpyxl模块让Python程序能读取和修改Excel电子表格文件。

1.打开Excel文档

打开Excel文档,返回一个workbook数据类型的值

import openpyxl

#1.打开Excel文档,返回一个workbook数据类型的值
wb = openpyxl.load_workbook('xiamen.xlsx')
type(wb)
>> openpyxl.workbook.workbook.Workbook

2.从工作簿中取得工作表

#2.从工作簿中取得工作表
#获取所有的表
wb.get_sheet_names()
>> ['Sheet1','Sheet2','Sheet3']

#获取特定名称的表
sheet = wb.get_sheet_by_name('Sheet3')
sheet.title
>> Sheet3
type(sheet)
>> openpyxl.worksheet.worksheet.Worksheet

#获取当前活动页
anotherSheet = wb.get_active_sheet()
anotherSheet
>> "Sheet1">

每个表由一个Worksheet对象表示,可以通过向工作簿方法get_sheet_by_name()传递表名字符串获得。
在取得Worksheet对象后,可以通过title属性取得它的名称。

也就是先通过openpyxl.load_workbook(‘xiamen.xlsx’)返回一个Excel对象,然后通过get
_sheet_by_name(‘Sheet1’)才能获得具体的列表。

3.从表中获取单元格

Python基础学习笔记(7)_第1张图片

有了Worksheet对象后,就可以按名字访问Cell对象。

Cell对象由value属性、row属性、column属性和coordinate属性。

#返回是C列对应的corrdinate,返回相当于一个个坐标,并不是一列的值
sheet = wb.get_sheet_by_name("Sheet1")
sheet['C']
>> (<Cell 'Sheet1'.C1>,
 <Cell 'Sheet1'.C2>,
 <Cell 'Sheet1'.C3>,
 <Cell 'Sheet1'.C4>,
 <Cell 'Sheet1'.C5>,
 <Cell 'Sheet1'.C6>,
 <Cell 'Sheet1'.C7>,
 <Cell 'Sheet1'.C8>,
 <Cell 'Sheet1'.C9>,
 <Cell 'Sheet1'.C10>,
 <Cell 'Sheet1'.C11>)

#返回的是4 行对应的坐标,返回的也是一个个坐标,并不是一行的值
sheet["4"]
>> (<Cell 'Sheet1'.A4>,
 <Cell 'Sheet1'.B4>,
 <Cell 'Sheet1'.C4>,
 <Cell 'Sheet1'.D4>,
 <Cell 'Sheet1'.E4>,
 <Cell 'Sheet1'.F4>)

#通过坐标,我们可以返回对应的值
c4 = sheet['C4']
c4.value
>> 'b3'
c4.row
>> 4
c4.column
>> 'C'
c4.coordinate
>> ''C4''

我们还可以通过指定行和列来获取坐标。

sheet.cell(row=1,column=2)
>> <Cell 'Sheet1'.B1>

4.从表中取得行和列

可以将Worksheet对象切片,取得电子表格中一行、一列或一个矩形区域中的所有Cell对象。
然后可以循环遍历这个切片中的所有单元格。

#从A1到C3的Generator对象,该对象包含该区域的Cell对象,为了看清楚这个对象,所以使用了tuple(),在一个元组中列出它的Cell对象。
tuple(sheet['A1':'C3'])
>> (('Sheet1'.A1>, 'Sheet1'.B1>, 'Sheet1'.C1>),
 ('Sheet1'.A2>, 'Sheet1'.B2>, 'Sheet1'.C2>),
 ('Sheet1'.A3>, 'Sheet1'.B3>, 'Sheet1'.C3>))

#这个元组包含3个元组:每个元组代表1行,我们使用两个for循环,外层for循环遍历这个切片中的每一行,然后针对每一行,内层for循环遍历该行中的每个单元格。

for rowofcellobjects in sheet['A1':'C3']:
    for cellobj in rowofcellobjects:
        print(cellobj.coordinate, cellobj.value)
    print('--- END OF ROW ---')

>> A1 None
B1 A
C1 B
--- END OF ROW ---
A2 1
B2 a1
C2 b1
--- END OF ROW ---
A3 2
B3 a2
C3 b2
--- END OF ROW ---

要访问特定行或列的单元格的值,也可以利用Worksheet对象的rows和columns属性。

import openpyxl
wb = openpyxl.load_workbook('test01.xlsx')
sheet = wb.get_active_sheet()

sheet.columns[1]
>>(<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.column[1]:
    print(cellobj.value)

>>Apples
Cherries
Pears
Oranges
Apples
Bananas
Strawberries

5.创建并保存Excel文档

调用openpyxl.Workbook()函数,创建一个新的Workbook对象。

import openpyxl
wb = openpyxl.Workbook()
wb.get_sheet_names()
>> ['Sheet']

sheet = wb.get_active_sheet()
sheet.title
>> 'Sheet'

sheet.title = 'Spam Bacon Eggs Sheet'
wb.get_sheet_names()
>> ['Spam Bacon Eggs Sheet']

工作簿将从一个工作表开始,名为Sheet。你可以将新的字符串保存在它的title属性中,从而改变工作表的名字。

import openpyxl
wb = openpyxl.load_workbook('example.xlsx')

sheet = wb.get_active_sheet()

sheet.title = 'Spam Bacon Eggs Sheet'

wb.save('example_copy.xlsx')

这里,我们改变了工作表的名称,为了保存变更,我们将文件名作为字符串传递给save()方法。传入的文件名与最初的文件名不同,这将变更保存到电子表格的一份拷贝中。
这样,如果代码中由缺陷,导致新的保存到文件中数据不对或讹误,还有最初的电子表格可以处理。

6.创建和删除工作表

利用create_sheet()和remove_sheet()方法,可以在工作簿中添加或删除工作簿。

import openpyxl

wb = openpyxl.Workbook()

wb.get_sheet_names
>> ['Sheet']

wb.create_sheet()
>> 'Sheet1'>
wb.get_sheet_names()
>> ['Sheet','Sheet1']
>
>
wb.create_sheet(index=0,title='First Sheet')
>> 'First Sheet'>
wb.get_sheet_names()
>> ['First Sheet','Sheet','Sheet1']

wb.create_sheet(index=2,title='Middle Sheet')
>> 'Middle Sheet'>
wb.get_sheet_names()
>> ['First Sheet','Sheet','Middle Sheet','Sheet1']

create_sheet()方法返回一个新的Worksheet对象,名为SheetX,它默认是工作簿的最后一个工作表。或者,可以利用index和title关键字次数,指定新工作表的索引或名称。

wb.get_sheet_names()
>> ['First Sheet','Sheet','Middle Sheet','Sheet1']

wb.remove_sheet(wb.get_sheet_by_name('Middle Sheet'))
wb.remove_sheet(wb.get_sheet_by_name('Sheet1'))

wb.get_sheet_names()
>> ['First Sheet','Sheet']

remove_sheet()方法接受一个Worksheet对象作为其参数,而不是工作表名称的字符串。
如果你知道要删除的工作表的名称,就调用get_sheet_by_name(),将它的返回值传入remove_sheet()。

在工作簿中添加或删除工作表之后,记得调用save()方法来保存更改。

7.将值写入单元格

将值写入单元格,很像将值写入字典中的键。

import openpyxl

wb = openpyxl.Workbook()

sheet = wb.get_sheet_by_name('Sheet')
sheet['A1'] = 'Hello World'
sheet['A1'].value

如果你有单元格坐标的字符串,可以像字典的键一样,将它用于Worksheet对象,指定要写入的单元格。

8.Font对象

Font对象的style属性影响文本在单元格中的显示方式。要设置字体风格属性,就向Font()函数传入构建字参数。

Python基础学习笔记(7)_第2张图片

import openpyxl
from openpyxl.styles import Font, Style

wb = openpyxl.Workbook()
sheet = wb.get_sheet_by_name('Sheet')

fontObj1 = Font(name='Times New Roman',bold=True)
styleObj1 = Style(font=fontObj1)
sheet['A1'].style/styleObj1
sheet['A1'] = 'Bold Times Roman'

fontObj2 = Font(size=24,italic=True)
styleObj2 = Style(font=fontObj2)
sheet['B3'].style/styleObj2
sheet['B3'] = '24pt Italic'

wb.save()

我们可以调用Font()来创建一个Font对象,并将这个Font对象保存在一个变量中。然后将它传递给Style(),得到的Style对象保存在一个变量中,并将这个变量赋给Cell对象的styel属性。

9.公式

例如:

sheet['B9'] = 'SUM(B1:B8)'

单元格A1和A2分别设置200和300。单元格A3设置为一个公式,求出A和A2的和。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A1'] = 200
sheet['A2'] = 300
sheet['A3'] = '=SUM(A1:A2)'
wb.save('writeFormula.xlsx')

我们也可以读取单元格中的公式,就像其他值一样。
Workbook对象要么显示公式,要么显示公式的结果,如果load_workbook()的data_only关键字参数设置位True是,只显示该公式的计算结果。不设置的话显示计算公式。

import openpyxl
wbFormulas = openpyxl.load_workbook('writeFormula.xlsx')
sheet = wbFormulas.get_active_sheet()
sheet['A3'].value
>> '=SUM(A1:A2)'

wbFormulas = openpyxl.load_workbook('writeFormula.xlsx',data_only=True)
sheet = wbFormulas.get_active_sheet()
sheet['A3'].value
>> 500

10.调整行和列

设置行高和列宽

import openpyxl
wb = openpyxl.Workbook()
sheet = wb,get_active_sheet()

sheet['A1'] = 'Tall row'
sheet['B2'] = 'Wide column'

sheet.row_dimensions[1].height = 70
sheet.column_dimensions['B'].width = 20

wb.save('dimensions.xlsx')

合并和拆分单元格

import openpyxl
wb = openpyxl.Workbook()
sheet = wb,get_active_sheet()

sheet.merge_cells('A1:D3')
sheet['A1'] = 'Twelve cells merged together'
sheet.merge_cells('C5:D5')
sheet['A1'] = 'Two cells merged cells'

wb.save('merged.xlsx')

冻结窗格

对于太大而不能一屏显示的电子表格,“冻结”顶部的几行或最左边的几列,是很有帮助的。
例如,冻结的列或行表头,就算用户用户滚动电子表格,也是始终可见的。这称为“冻结窗口”。

import openpyxl

wb = openpyxl.load_workbook('xiamen.xlsx')
sheet = wb.get_active_sheet()
sheet.freeze_panes = 'A6'
wb.save('freezeExample5.xlsx')

冻结显示结果:

Python基础学习笔记(7)_第3张图片

冻结窗格的例子:

附注:Pandas读取Excel

感觉如果只是使用Excel进行数据分析,可以推荐Pandas模块。

你可能感兴趣的:(Python)