python之excel

Excel是Window环境下流行的,强大的电子表格应用openpyxl模块让Python程序能读取和修改Excel电子表格文件.例如,可能有一个无聊的任务,需要从一个电子表格拷贝一些数据,粘贴到另一个电子表格中.或者可能需要从几千行挑选几行,根据某种条件稍做修改.又或者查看几百份部门预算电子表格,寻找其中的赤字.正是这种无聊无脑的电子表格任务,可以通过python来完成.
LibreOffice Calc和OpenOffice Calc都能处理excel的电子表格文件格式.这意味着openpyxl模块也能处理来自这些应用程序的电子表格.即使你的计算机上面已经安装了Excel可能会发现这些程序更容易使用.
首先,让我们看一些基本的定义,一个Excel电子表格文档称为一个工作簿.一个工作簿保存在扩展名为.xlsx的文件中.每个工作簿可以包含多个表(也称为工作表).用户当前查看的表(或关闭Excel前最后查看的表),称为活动工作表.
每一个表都有一些列(地址是从A开始的字母)和一些行(地址是从1开始的数字).在特定行和列的方格称为单元格.每个单元格都包含一个数字或文本值.单元格形成的网格和数据构成了表.
pythoh没有自带openpyxl,所以必须安装. 模块的名称是openpyxl.要测试它是否安装正确,就在交互式环境下输入代码:

>>> import openpyxl

如果该模块正确安装,就不会产生错误信息.记得在运行本章的交互式环境例子之前, 要导入 openpyxl模块,否则会得到错误,NameError:name’openpyxl’is not defined。
openpyxl团队会经常发布新的版本.不过不用担心,新版本应该在相当长的时间内向后兼容,支持所用使用的指令.
本章的例子使用一个电子表格example.xlsx,它保存在根文件中.你可以自己创建这个电子文档.这是Excel自动为新工作簿提供的(不同的操作系统和电子表格程序,提供的默认的表格数可能不同).
既然有了示例电子表格,就看看如和用openpyxl模块来操作它
用openpyxl模块打开Excel文档
在导入openpyxl模块后就可以使用openpyxl.load_workbook()函数.在交互式的环境中输入以下代码:

>>> import openpyxl
>>> wb=openpyxl.load_workbook('/Users/spurs/Desktop/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('/Users/spurs/Desktop/example.xlsx')
>>> wb.get_sheet_names()

Warning (from warnings module):
  File "<pyshell#2>", line 1
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet=wb.get_sheet_by_name('Sheet3')
Warning (from warnings module):
  File "<pyshell#3>", line 1
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
>>> sheet
<Worksheet "Sheet3">
>>> type(sheet)
<class 'openpyxl.worksheet.worksheet.Worksheet'>
>>> sheet.title
'Sheet3'
>>> anotherSheet=wb.get_active_sheet()
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    anotherSheet=wb.get_active_sheet()
AttributeError: 'Workbook' object has no attribute 'get_active_sheet'
>>> 

每一表由一个Worksheet对象表示,可以通过向工作簿方法get_sheet_by_name()传递表名字字符串获得.最后,可以调用Workbook对象的get_active_sheet()方法,取得工作簿的活动表.活动表是工作簿在Excel中打开时候出现的工作表.在取得Worksheet对象后,可以通过title属性获取它的名称.

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

>>> import openpyxl
>>> wb=openpyxl.load_workbook('/Users/spurs/Desktop/example.xlsx')
>>> sheet = wb.get_sheet_by_name('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
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    'Row ' + str(c.row) + ', Column ' + c.column + ' is ' + c.value
TypeError: can only concatenate str (not "int") to str
>>> 'Row ' + str(c.row) + ', Column ' + str(c.column)+ ' is ' + c.value
'Row 1, Column 2 is Apples'
>>> 'Cell ' + str(c.coordinate) + ' is ' + c.value
'Cell B1 is Apples'
>>> sheet['C1'].value

cell对象由一个value属性,不出意外,它包含这个单元格中保存的值.Cell对象也有row column coordinate属性,提供该单元格的位置信息.
这里访问单元格B1的Cell对象的value属性,我们得到字符串’apple’,row属性给出的是整数1,column属性给出的是’B’,coordinate属性给出的是‘B1‘.
openpyxl模块将自动解释列A中的日期,将它们返回为datetime的值,而不是字符串.
用字母来指定列,在这个程序中可能有一点奇怪,特别是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
>>> for i in range(1, 8, 1):
	for j in range(1,4,1):
		print(i, sheet.cell(row=i, column=j).value)

		
1 2015-04-05 13:34:02
1 Apples
1 73
2 2015-04-05 03:41:23
2 Cherries
2 85
3 2015-04-06 12:46:51
3 Pears
3 14
4 2015-04-08 08:59:43
4 Oranges
4 52
5 2015-04-10 02:07:00
5 Apples
5 152
6 2015-04-10 18:10:37
6 Bananas
6 23
7 2015-04-10 02:40:46
7 Strawberries
7 98

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

bug了,sorry

资料上面的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GOD FOR JAVA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值