《2022年python中xlwt和xlrd库使用分析 .pdf》由会员分享,可在线阅读,更多相关《2022年python中xlwt和xlrd库使用分析 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、python中使用 xlrd、xlwt操作 excel 表格详解投稿:junjie 字体:增加 减小 类型:转载时间:2015-01-29我要评论这篇文章主要介绍了python 中使用 xlrd、xlwt 操作 excel 表格详解,python 操作 excel 主要用到 xlrd 和 xlwt 这两个库,即xlrd 是读 excel,xlwt 是写 excel 的库,需要的朋友可以参考下最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python 对 excel 的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的 研究(用此一词让我
2、觉得颇有成就感)之后,基本解决了日常所需。主要记录使用过程的常见问题及解决。python 操作 excel 主要用到xlrd 和 xlwt 这两个库,即 xlrd 是读 excel,xlwt 是写 excel 的库。可从这里下载https:/pypi.python.org/pypi。下面分别记录python 读和写 excel.python读 excel xlrd这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。下面先看看基本的操作:首先读一个excel 文件,有两个sheet,测试用第二个sheet,sheet2 内容如下:python 对 excel 基本的操作如下:?1 2
3、3 4 5 6 7 8 9 10 11 12 13 14#-*-coding:utf-8-*-importxlrdimportxlwtfromdatetime importdate,datetimedefread_excel():#打开文件名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 12 页 -15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 workbook=xlrd.open_workbook(rF:demo.xlsx)#获取所有sheetprintworkbook.sheet_names()#u
4、sheet1,usheet2 sheet2_name=workbook.sheet_names()1#根据 sheet索引或者名称获取sheet内容 sheet2=workbook.sheet_by_index(1)#sheet索引从 0 开始 sheet2=workbook.sheet_by_name(sheet2)#sheet的名称,行数,列数printsheet2.name,sheet2.nrows,sheet2.ncols#获取整行和整列的值(数组)rows=sheet2.row_values(3)#获取第四行内容 cols=sheet2.col_values(2)#获取第三列内容pr
5、introwsprintcols#获取单元格内容printsheet2.cell(1,0).value.encode(utf-8)printsheet2.cell_value(1,0).encode(utf-8)printsheet2.row(1)0.value.encode(utf-8)#获取单元格内容的数据类型名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 12 页 -printsheet2.cell(1,0).ctypeif_name_=_main_:read_excel()运行结果如下:那么问题来了,上面的运行结果中红框框中的字段明明是出生日期,可显示的确实浮点数。好的,
6、来解决第一个问题:1、python读取 excel中单元格内容为日期的方式python 读取 excel 中单元格的内容返回的有5 种类型,即上面例子中的ctype:?1 ctype:0empty,1string,2number,3date,4boolean,5error即 date 的 ctype=3,这时需要使用xlrd 的 xldate_as_tuple来处理为date 格式,先判断表格的 ctype=3时 xldate 才能开始操作。现在命令行看下:?1 2 3 4 5 6 7 8 9 10 sheet2.cell(2,2).ctype#1990/2/22 sheet2.cell(2,
7、1).ctype#24 sheet2.cell(2,0).ctype#小胖 sheet2.cell(2,4).ctype#空值(这里是合并单元格的原因)sheet2.cell(2,2).value#1990/2/22名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 12 页 -11 12 13 14 15 33656.0 xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)(1992,2,22,0,0,0)date_value=xlrd.xldate_as_tuple(sheet2.cell_value(2,2
8、),workbook.datemode)date_value(1992,2,22,0,0,0)date(*date_value:3)datetime.date(1992,2,22)date(*date_value:3).strftime(%Y/%m/%d)1992/02/22即可以做下简单处理,判断ctype 是否等于3,如果等于3,则用时间格式处理:?1 2 3 if(sheet.cell(row,col).ctype=3):date_value=xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)date_tmp=date
9、(*date_value:3).strftime(%Y/%m/%d)那么问题又来了,上面sheet2.cell(2,4).ctype 返回的值是0,说明这个单元格的值是空值,明明是合并的单元格内容好朋友,这个是我觉得这个包功能不完善的地方,如果是合并的单元格那么应该合并的单元格的内容一样,但是它只是合并的第一个单元格的有值,其它的为空。?1 2 3 4 5 sheet2.col_values(4)u u5173u7cfb,uu597du670bu53cb,u u540cu5b66,名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 12 页 -6 7 8 9 10 11 12 13
10、14 15 16 17 18 19 20 21 22 u u4e00u4e2au4eba,fori inrange(sheet2.nrows):printsheet2.col_values(4)i关系好朋友同学一个人 sheet2.row_values(7)u u65e0u540d,20.0,u u6682u65e0,fori inrange(sheet2.ncols):printsheet2.row_values(7)i无名20.0暂无2、读取合并单元格的内容这个是真没技巧,只能获取合并单元格的第一个cell 的行列索引,才能读到值,读错了就是空值。即合并行单元格读取行的第一个索引,合并列单
11、元格读取列的第一个索引,如上述,读取行合并单元格 好朋友 和读取列合并单元格暂无 只能如下方式:?名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 12 页 -1 2 3 4 5 6 7 printsheet2.col_values(4)1好朋友 printsheet2.row_values(7)2暂无 sheet2.merged_cells#明明有合并的单元格,为何这里是空 疑问又来了,合并单元格可能出现空值,但是表格本身的普通单元格也可能是空值,要怎么获取单元格所谓的第一个行或列的索引呢?这就要先知道哪些是单元格是被合并的!3、获取合并的单元格读取文件的时候需要将formatt
12、ing_info参数设置为True,默认是 False,所以上面获取合并的单元格数组为空,?1 2 3 4 workbook=xlrd.open_workbook(rF:demo.xlsx,formatting_info=True)sheet2=workbook.sheet_by_name(sheet2)sheet2.merged_cells(7,8,2,5),(1,3,4,5),(3,6,4,5)merged_cells 返回的这四个参数的含义是:(row,row_range,col,col_range),其中row,row_range)包括 row,不包括 row_range,col也是一
13、样,即(1,3,4,5)的含义是:第1到 2 行(不包括3)合并,(7,8,2,5)的含义是:第2 到 4 列合并。利用这个,可以分别获取合并的三个单元格的内容:?1 2 3 4 5 6 printsheet2.cell_value(1,4)#(1,3,4,5)好朋友 printsheet2.cell_value(3,4)#(3,6,4,5)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 12 页 -同学 printsheet2.cell_value(7,2)#(7,8,2,5)暂无发现规律了没?是的,获取 merge_cells 返回的 row 和 col 低位的索引即可!于是
14、可以这样一劳永逸:?1 2 3 4 5 6 7 8 9 10 11 12 13 merge=for(rlow,rhigh,clow,chigh)insheet2.merged_cells:merge.append(rlow,clow)merge 7,2,1,4,3,4 forindex inmerge:printsheet2.cell_value(index0,index1)暂无好朋友同学python写 excel xlwt写 excel 的难点可能不在构造一个workbook的本身,而是填充的数据,不过这不在范围内。在写 excel 的操作中也有棘手的问题,比如写入合并的单元格就是比较麻烦的
15、,另外写入还有不同的样式。这些要看源码才能研究的透。我构思 了如下面的sheet1,即要用xlwt 实现的东西:名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 12 页 -基本上看起来还算复杂,而且看起来很正规,完全是个人杜撰。代码如下:?1 2 3 4 5 6 7 8 9 10 11 12 13 14 设置单元格样式defset_style(name,height,bold=False):style=xlwt.XFStyle()#初始化样式 font=xlwt.Font()#为样式创建字体 font.name=name#Times New Roman font.bold=bol
16、d名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 12 页 -15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 font.color_index=4 font.height=height#borders=xlwt.Borders()#borders.left=6#borders.right=6#borders.top=6#borders.bottom=6 style.font=font#style.borders=bordersreturnstyle#写 exceldefwrite_excel():
17、f=xlwt.Workbook()#创建工作簿创建第一个sheet:sheet1 sheet1=f.add_sheet(usheet1,cell_overwrite_ok=True)#创建 sheet row0=u 业务 ,u 状态 ,u 北京 ,u 上海 ,u 广州 ,u 深圳 ,u 状态小计名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 12 页 -37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 ,u 合计 column0=u 机票 ,u 船票 ,u 火车票 ,u 汽车票 ,u 其它 stat
18、us=u 预订 ,u 出票 ,u 退票 ,u 业务小计#生成第一行fori inrange(0,len(row0):sheet1.write(0,i,row0i,set_style(Times New Roman,220,True)#生成第一列和最后一列(合并 4 行)i,j=1,0whilei 4*len(column0)andj len(column0):sheet1.write_merge(i,i+3,0,0,column0j,set_style(Arial,220,True)#第一列 sheet1.write_merge(i,i+3,7,7)#最后一列 合计 i+=4 j+=1 she
19、et1.write_merge(21,21,0,1,u 合计 ,set_style(Times NewRoman,220,True)#生成第二列 i=0whilei 4*len(column0):forj inrange(0,len(status):名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 12 页 -59 60 61 62 63 64 65 sheet1.write(j+i+1,1,statusj)i+=4 f.save(demo1.xlsx)#保存文件if_name_=_main_:#generate_workbook()#read_excel()write_exce
20、l()需要稍作解释的就是write_merge方法:write_merge(x,x+m,y,w+n,string,sytle)x 表示行,y 表示列,m 表示跨行个数,n 表示跨列个数,string 表示要写入的单元格内容,style 表示单元格样式。其中,x,y,w,h,都是以 0 开始计算的。这个和 xlrd 中的读合并单元格的不太一样。如上述:sheet1.write_merge(21,21,0,1,u合计,set_style(Times New Roman,220,True)即在 22 行合并第 1,2 列,合并后的单元格内容为合计,并设置了style。如果需要创建多个sheet,则只
21、要f.add_sheet即可。如在上述write_excel 函数里 f.save(demo1.xlsx)这句之前再创建一个sheet2,效果如下:代码也是真真的easy 的了:?名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 12 页 -1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 创建第二个sheet:sheet2 sheet2=f.add_sheet(usheet2,cell_overwrite_ok=True)#创建 sheet2 row0=u 姓名 ,u 年龄 ,u 出生日期 ,u 爱好 ,u 关系 col
22、umn0=u 小杰 ,u 小胖 ,u 小明 ,u 大神 ,u 大仙 ,u 小敏 ,u 无名#生成第一行fori inrange(0,len(row0):sheet2.write(0,i,row0i,set_style(Times New Roman,220,True)#生成第一列fori inrange(0,len(column0):sheet2.write(i+1,0,column0i,set_style(Times New Roman,220)sheet2.write(1,2,1991/11/11)sheet2.write_merge(7,7,2,4,u 暂无 )#合并列单元格 sheet2.write_merge(1,2,4,4,u 好朋友 )#合并行单元格 f.save(demo1.xlsx)#保存文件名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 12 页 -