从Excel到Python:用Python轻松处理Excel数据,python excel文件操作
一、简介
用大蟒来自动生成超过数据文件蟒蛇。处理超过文件主要是第三方模块库xlrd、xlwt、xluntils和pyExcelerator,除此之外,python处理超过还可以用win32com和安装模块。
安装:
点安装xlutils
二、使用读操作读取文件:
importxlrd#打开一个练习本
workbook=xlrd。open _ workbook( E:\ \ Code \ \ Python \ \ test data。xls )#抓取所有表页的名称
工作表=工作簿。sheet _ names()print( worksheets is % s % worksheets)#定位到工作表一
工作表1=工作簿。工作表名称(u 工作表1 ) #通过索引顺序获取
工作表1=工作簿。工作表()[0]
#或
工作表1=workbook.sheet_by_index(0)
#遍历所有表对象
对于工作表中的工作表名称:
工作表=工作簿。工作表名称(工作表名称)
#遍历工作表一中所有行排
num _ rows=工作表1。范围内curr _ row的nrows(num _ rows):
row=工作表1。row _ values(curr _ row)print( row % s is % s %(curr _ row,row))#遍历工作表一中所有列山口
num _ cols=工作表1。范围内curr _ col的ncols(num _ cols):
col=工作表1。col _ values(curr _ col)print( col % s is % s %(curr _ col,col))#遍历工作表一中所有单元格细胞
for rown in range(num _ rows):for coln in range(num _ cols):
单元格=工作表1。cell _ value(rown,coln)打印单元格 #其他写法:
cell=worksheet1.cell(rown,coln).价值
打印单元格
#或
单元格=工作表1。row(rown)[coln].价值
打印单元格
#或
单元格=工作表1。列[行].价值
打印单元格
#获取单元格中值的类型,类型0空,1字符串,2数字,3日期,4布尔值,5错误
cell _ type=工作表1。cell _ type(rown,coln)
打印单元格类型
示例:
整体思路为,打开文件,选定表格,读取行列内容,读取表格内数据
从日期时间导入日期,日期时间
file=test3.xlsx
defread_excel():
WB=xlrd。open _ workbook(文件名=文件)#打开文件
print(wb.sheet_names())#获取所有表格名字
sheet1=wb.sheet_by_index(0)#通过索引获取表格
sheet2=wb.sheet_by_name(年级)#通过名字获取表格
print(sheet1,sheet2)print(sheet1.name,sheet1.nrows,sheet1.ncols)
rows=sheet1.row_values(2)#获取行内容
cols=sheet1.col_values(3)#获取列内容
打印(行)打印(列)print(sheet1.cell(1,0).值)#获取表格里的内容,三种方式
print(sheet1.cell_value(1,0))print(sheet1.row(1)[0].值)
运行结果如下:
那么问题来了,上面的运行结果中红框框中的字段明明是出生日期,可显示的确实浮点数;同时合并单元格里面应该是有内容的,结果不能为空。
别急,我们来一一解决这两个问题:
1.计算机编程语言读取超过中单元格内容为日期的方式
计算机编程语言读取超过中单元格的内容返回的有5种类型,即上面例子中的ctype:
ctype : 0空,1字符串,2数字,3日期,4布尔值,5错误
即日期的ctype=3,这时需要使用读操作的xldate_as_tuple来处理为日期格式,先判断表格的ctype=3时xldate才能开始操作。
详细代码如下:
从datetime导入日期,datetimeprint(sheet1.cell(1,2))导入xlrd .ctype)
日期值=xlrd。xldate _ as _ tuple(表1。单元格值(1,2),WB。日期模式)print(日期值)print(日期(*日期值[:3]))print(日期(*日期值[:3]).strftime(%Y/%m/%d ))
运行结果如下:
2.获取合并单元格的内容
在操作之前,先介绍一下合并单元格()用法,合并_单元格返回的这四个参数的含义是:(行,行范围,列,列范围),其中[行,行范围]包括行,不包括行范围列也是一样,即(1, 3, 4, 5)的含义是:第一到2行(不包括3)合并,(7, 8, 2, 5)的含义是:第2到四列合并。
详细代码如下:
打印(第1页。merged _ cells)打印(第1页。cell _ value(1,3))print(sheet1.cell_value(4,3))
运行结果如下:
发现规律了没?是的,获取合并_单元格返回的排和山口低位的索引即可!于是可以这样批量获取:
详细代码如下:
merge=[]print(第1页。merged _ cells)for(rlow,rhigh,clow,chigh) insheet1.merged_cells:
合并:打印(第1页。cell _ value(索引[0],索引[1])中索引的merge.append([rlow,clow])
运行结果跟上图一样,如下:
三、使用xlwt生成超过文件(可以控制超过中单元格的格式):
importxlwt#创建练习本和表对象
工作簿=xlwt .工作簿()#注意练习本的开头W要大写
工作表1=工作簿。add _ sheet(工作表1 ,cell_overwrite_ok=True)
工作表2=工作簿。add _ sheet( sheet 2 ,cell_overwrite_ok=True)#向表页中写入数据
sheet1.write(0,0,这将覆盖1 )
sheet1.write(0,1, aaaaaaaaaaaa )
sheet2.write(0,0,这应该覆盖2 )
sheet2.write(1,2, bbbbbbbbbbbbbb ) #-使用样式-
#初始化样式
style=xlwt .XFStyle()
#为样式创建字体
font=xlwt .字体()
font.name=Times New Roman
font.bold=True
#设置样式的字体
style.font=font
#使用样式
sheet.write(0,1,某些粗体文本,样式)“”
#保存该超过文件,有同名文件时直接覆盖
工作簿。保存( E:\ \ Code \ \ Python \ \ test 2。xls)打印创建超过文件完成!
示例:
importxlwt#设置表格样式
def set_style(name,height,bold=False):
style=xlwt .XFStyle()
font=xlwt .字体()
font.name=name
font.bold=bold
字体。color _ index=4字体高度=高度
style.font=fontreturnstyle#写超过
defwrite_excel():
f=xlwt .工作簿()
sheet1=f.add_sheet(学生,cell_overwrite_ok=True)
row0=[姓名,年龄,出生日期,爱好]
列0=[苹果短靴,痴情的钢铁侠,恋习 Python , zjdhh , pydxf ,无名]#写第一行
对于i inrange(0,len(row0)):
sheet1.write(0,I,row0[i],set_style(Times New Roman ,220,True))#写第一列
对于i inrange(0,len(第0列)):
sheet1.write(i 1,0,column 0[I],set_style(Times New Roman ,220,True))
第一页。写(2006年年12月12日一月3日)
sheet1.write_merge(6,6,1,3,未知)#合并行单元格
sheet1.write_merge(1,2,3,3,打游戏)#合并列单元格
sheet1.write_merge(4,5,3,3,打篮球)
f。保存(测试。xls )if _ _ name _ _= _ _ main _ _ :
write_excel()
结果图:
在此,对write_merge()的用法稍作解释,如上述:sheet1.write_merge(1,2,3,3,打游戏),即在四列合并第2,3列,合并后的单元格内容为合计,并设置了风格。其中,里面所有的参数都是以0开始计算的。
四、使用xluntils模块修改文件:
importxlrdimportxlutils.copy#打开一个练习本
Rb=xlrd。open _ workbook( E:\ \ Code \ \ Python \ \ test1。xls’)
#复制的超过是没有格式的,要保留原格式需要使用:Rb=xlrd。open _ workbook( E:\ \ Code \ \ Python \ \ test1。xls ,formatting_info=True)
wb=xlutils.copy.copy(rb)#获取表对象,通过工作表索引()获取的表对象没有写()方法
ws=wb.get_sheet(0)#写入数据
ws.write(1,1,已更改!)#添加表页
wb.add_sheet(sheetnnn2 ,cell_overwrite_ok=True)#利用保存时同名覆盖达到修改超过文件的目的,注意未被修改的内容保持不变
WB。保存( E:\ \ Code \ \ Python \ \ test1。xls’)
在修改的过程中,使用ws.write()被修改的单元格会清空格式,若要保留原格式,需要使用以下函数:
#本文重点,该函数中定义:对于没有任何修改的单元格,保持原有格式。
defsetOutCell(outSheet,col,row,value): 在不更改格式的情况下更改单元格值
def_getOutCell(outSheet,colIndex,rowIndex):HACK:提取内部xlwt单元格表示 row=outSheet ._Worksheet__rows.get(rowIndex)如果不是行:返回无
单元格=行. Row _ _单元格。get(colIndex)返回单元格# HACK保留单元格样式。
previous cell=_ getout cell(out sheet,col,row)#END HACK,PART I
outSheet.write(row,col,value)#HACK,第二部分
ifpreviousCell:
newCell=_getOutCell(outSheet,col,row)ifnewCell:
新牢房。xf _ idx=上一个单元格。xf _ idx #使用函数setOutCell代替ws.write()
setOutCell(ws,col,row,写入内容)
五pyExcelerator模块与xlwt类似,也可以用来生成超过文件
读:
importpyExcelerator#parse_xls返回一个列表,每项都是一个表页的数据。#每项是一个二元组(表名,单元格数据)。其中单元格数据为一个字典,键值就是单元格的索引(我,j)。如果某个单元格无数据,那么就不存在这个值
sheets=pyexcelerator . parse _ xls( E:\ \ Code \ \ Python \ \ testdata . xls )打印工作表
写:
Importpyexcelrator #创建工作簿和工作表对象。
wb=pyExcelerator。工作簿()
Ws=wb.add_sheet(u 第一页)#设置样式
myfont=pyExcelerator。字体()
my font . name=u times New Roman my font . bold=True
mystyle=pyExcelerator。XFStyle()
Mystyle.font=myfont#使用样式写入数据
Ws.write(0,0,uni好帕索!mystyle)#保存excel文件,如果有同名文件直接覆盖。
WB . save( e:\ \ code \ \ python \ \ mini . xls )print excel文件创建完成!
不及物动词错误报告:
但是我们会发现,在读取xlsx格式的Excel时,传入的formatting_info会直接抛出异常,而在读取xls文件时则不存在这个问题。
引发notimplementererror( formatting _ info=True尚未实现)
不难推断,抛出异常的原因是formatting_info还没有完全兼容新版本xlsx的格式。
那么如果我们要操作的文件恰好是xlsx格式,我们想保存它的原始格式怎么办?
1.将xlsx更改为xls(推荐)
将xlsx保存为xls,然后进行后续操作。亲测有效,可以正常保存Excel原始格式,无需修改代码。
2.请改用openpyxl
编码尝试读取文件,处理速度真的很慢.所有的规则和宏都丢失了。
3.使用pywin32
这是用于Win32 (pywin32)扩展的Python扩展库。它提供了从Python对许多Windows api的访问。
4.使用旧版本xlrd-0.6.1。
可以用xlrd-0.6.1读取,不会抛出异常。直到我传入了其他几个xls文件,预期的bovrecord出现了;发现0x4b50错误,因为xlrd-0.6.1不支持office2007。
参考:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。