最近有需要使用代码来处理excel表格的小task,原来是用手动复制的方式完成的,感觉效率低下而且还弄的头昏脑涨。于是决定写一个python脚本完成这种体力劳动,写好脚本,只需要run一下,一切搞定,好了不多说了,进入正文。
任务主要是对xls读和写,网上找了一下资料就选择了xlrd来完成excel表格的读取,xlwt完成excel表格的写入。xlutils的功能实际上更加强大和全面,包含渡河写的功能,小伙伴们实际上也可以选择这个宝来完成对excel表格的处理,具体可以参见http://www.python-excel.org/的说明。
Workbook类
对应excel的工作簿,也就是对应一个xls文件。类封装了需要写入xls文件的数据,和一系列的操作。属于xlwt package下,用于写和产生xls文件,读xls文件对应使用xlrd package下的Book类
构造函数原型
Workbook(encoding='ascii',style_compression=0)
Worksheet类
对应一个工作簿中的工作表,包含工作表的内容和一系列的操作,属于 xlwt package下,主要用于产生一个Workbook下的一张工作表,对应xlrd包下的Sheet类。
构造函数原型
Worksheet(sheetname, parent_book)
Cell模块
在xlwt package下有一个Cell模块其中定义了很多种类的cell类,对应excel表格中的单元格,xlrd下邮单一的Cell类用来存储读取到的单元格数据
#-*-coding:utf-8-*-
__author__ = 'LiGaofeng'
from xlrd import *
book = open_workbook('original.xls') #读入整个xls文件,返回一个Book实例
sht_chkSeq = book.sheet_by_index(0) #通过索引读表
sht_ref = book.sheet_by_index(1) #
sht_walking = book.sheet_by_name('walking') #通过sheet名字读表
val_col = sht_chkSeq.col_values(0,1) #读sheet的第0列数据,从第1行开始,可以指定结束行,不指定默认到末尾
val_cell = sht_chkSeq.cell_value(0,1) #读sheet第0行第1列单元格的数据,读出的数据是str,如果需要用作数字处理需要转换
val_row = sht_chkSeq.row_values(0,1, 6) #读sheet的第0行数据,从第1列开始,到第6列结束
#-*-coding:utf-8-*-
__author__ = 'LiGaofeng'
from xlwt import *
'''
单元格style定义
'''
g_normalStyle = XFStyle()
g_normalStyle.pattern.pattern = 1 #设置有填充北京颜色,默认没有,只有设置这个值pattern_fore_colour的设置才有效
g_normalStyle.pattern.pattern_fore_colour = 1 #设置单元格的背景填充色为白色,
'''
pattern.pattern_fore_colour = 5 # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue,
5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown),
20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
'''
g_normalStyle.borders.left = 1 #左边框为细线
g_normalStyle.borders.right = 1 #右边框细线
g_normalStyle.borders.top = 1 #上边框细线
g_normalStyle.borders.bottom = 1 #下边框细线,默认的是没有边框的
g_headerFont = Font()
g_headerFont.bold = True #使用粗体
g_headerFont._weight = 15 #设置字体大小
g_headerStyle = XFStyle()
g_headerStyle.font = g_headerFont #设置字体
g_headerStyle.alignment.horz = 2 #居中
g_headerStyle.borders.left = 1
g_headerStyle.borders.right = 1
g_headerStyle.borders.top = 1
g_headerStyle.borders.bottom = 1
'''
sheet写入
'''
bk_invoice = Workbook() #创建工作簿
sht_invoice = bk_invoice.add_sheet('invoice') #通过名字在工作簿中添加工作表
sht_invoice.write(0, 1, 'hello world') #对第0行第1列的单元格写入'hello world',style采用默认的
sht_invoice.write(1, 1, 'hello world', g_normalStyle) #按照自定义的style
#感觉一个不好的地方是Worksheet类中没有自带的写入一行的函数,于是自己动手写了一个简单的
'''
对sheet写入行
将vals的内容写入到sht,从col开始
'''
def writeLine(sht, vals, row, col = 0, cellStyle = g_normalStyle):
for i in range(len(vals)):
sht.write(row, col + i, vals[i], cellStyle)
#有时候需要合并单元格式写入
sht_invoice.write_merge(1, 1, 0, 12, u'申请表', g_headerStyle)
#将工作表的第一行0列到第一行12列合并为一个单元格并且写入'申请表',采用g_headerStyle,不设置风格的话采用默认的风格
#写入汉字的时候最好指定为utf8编码不然的话容易出现编码问题