从Excel到Python-用Python轻松处理Excel数据,python excel文件操作

  从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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: