前段时间作了个小项目,帮个海洋系的教授作了个数据处理的软件。基本的功能很简单,就是对Excel里面的一些数据进行过滤,统计,对多个表的内容进行合并等。以前没有处理Excel数据的经验,甚至于本身都不多用到Excel。记得《Python核心编程》的最后一章里有讲到用Win32 COM操做office, 看了一下讲的不是很清楚。google了一下找到很多能处理excel数据的模块。对比了一下最终选定了openpyxl,openpyxl专门用于处理Excel2007及以上版本产生的xlsx文件。不幸的是我所获得的数据中xls和xlsx都有,不过转换并非什么难事,就暂时吧这个问题忽略了。python
模块的安装过程很是简单,官网上有简单的使用说明和API文档,总体来讲使用很是容易,也基本能知足个人需求。对于Excel文件,我所须要的只是从中将相应位置的数据读取出来,以及把数据写入到对应的位置中去。而其间数据的处理,经过python能够很容易地完成。编程
openpyxl中定义了多种数据格式,我只涉及到了其中最重要的三种:
NULL: 空值,对应于python中的None,表示这个cell里面没有数据。
numberic: 数字型,统一按照浮点数来进行处理。对应于python中的float。
string: 字符串型,对应于python中的unicode。google
每个Excel数据文件从上至下分为三个层级的对象:
workbook: 每个Excel文件就是一个workbook。
sheet: 每个workbook中能够包含多个sheet,具体就对应Excel中咱们在左下脚所看到的“sheet1”,“sheet2”等。
cell: 每个sheet就是咱们一般所看到的一个表格,能够含有m行,n列,每一个肯定的行号,列号所对应的一个格子就是一个cell。excel
从一个既有的xlsx文件中读取数据,按照Excel文件的三个层级,分别作如下三个步骤code
1. 打开workbook:对象
from openpyxl import load_workbook wb = load_workbook('file_name.xlsx')
2. 打开所需的sheet:
咱们能够这样打开workbook中的第一个sheet:索引
ws = wb.get_active_sheet()
变量_active_sheet_index用来肯定获取哪个sheet,而默认状况下它被置为0。
也能够经过sheet的名称来获取sheet:unicode
ws = wb.get_sheet_by_name("sheet_name")
openpyxl彷佛没有提供按索引来读取sheet,不过咱们老是能很容易地经过sheet_name来实现:文档
sheet_names = wb.get_sheet_names() ws = wb.get_sheet_by_name(sheet_names[index])
3. 获取对应cell的值:
openpyxl提供可两种方式来读取cell,一是按照Excel的习惯用字母来表明列号,例如:字符串
c = ws.cell('A4').value
也能够按照行号列号来读取:
d = ws.cell(row = 3, column = 0)
同读取相似,写入一个Excel文件,要经历一下四个步骤:
1. 新建workbook
直接新建一个workbook对象便可:
wb = Workbook()
2. 新建sheet
默认状况下,新建立的sheet是排在最后的,若想要建立一个排在最前的sheet,能够传入参数0:
ws1 = wb.create_sheet() # insert at the end ws2 = wb.create_sheet(0) # insert at the first position
3. 写入数据
直接将要写入的数据赋值给相应的cell便可,若仅仅是修改一个表。能够跳过前两个步骤,不过要注意不要覆盖掉其它数据:
ws.cell('B5') = value1 ws.cell(row = 3, column = 7) = value2
4. 保存数据
最后写入将数据写入便可,注意若保存路径下有同名的文件的话,以前的文件会被覆盖:
wb.save('file_name.xlsx')