社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python读写Excel表格,就是这么简单粗暴又好用(文末送书)

脚本之家 • 4 年前 • 534 次点击  

 关注脚本之家,与百万开发者在一起

导读:手把手教你用Python批量读写Excel表格
来源 | 恋习Python(ID:sldata2017

最近在做一些数据处理和计算的工作,因为数据是以.csv格式保存的,因此刚开始直接用Excel来处理。但是做着做着发现重复的劳动其实并没有多大的意义,于是就想着写个小工具帮着处理。以前正好在一本书上看到过使用Python来处理Excel表格,可惜没有仔细看。于是我到处查找资料,基本解决了日常所需,终于算是完成了任务,因此撰写此文就算是总结吧,主要记录使用过程的常见问题及解决。


python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel。


Python写excel——xlwt


Python写excel的难点不在构造一个workbook的本身,而是填充的数据,不过这不在范围内。在写excel的操作中也有棘手的问题,比如写入合并的单元格就是比较麻烦的,另外写入还有不同的样式。
详细代码如下:
import xlwt
#设置表格样式def set_style(name,height,bold=False): style = xlwt.XFStyle() font = xlwt.Font() font.name = name font.bold = bold font.color_index = 4 font.height = height style.font = font return style
#写Exceldef write_excel(): f = xlwt.Workbook() sheet1 = f.add_sheet('学生',cell_overwrite_ok=True) row0 = ["姓名","年龄","出生日期","爱好"] colum0 = ["张三","李四","恋习Python","小明","小红","无名"] #写第一行 for i in range(0,len(row0)): sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True)) #写第一列 for i in range(0,len(colum0)): sheet1.write(i+1,0,colum0[i],set_style('Times New Roman',220,True))
sheet1.write(1,3,'2006/12/12') sheet1.write_merge(6,6,1,3,'未知')#合并行单元格 sheet1.write_merge(1,2,3,3,'打游戏')#合并列单元格 sheet1.write_merge(4,5,3,3,'打篮球')
f.save('test.xls')
if __name__ == '__main__': write_excel()

结果图:


在此,对write_merge()的用法稍作解释,如上述:sheet1.write_merge(1,2,3,3,'打游戏'),即在四列合并第2,3列,合并后的单元格内容为"合计",并设置了style。其中,里面所有的参数都是以0开始计算的。


Python读excel——xlrd


Python读取Excel表格,相比xlwt来说,xlrd提供的接口比较多,但过程也有几个比较麻烦的问题,比如读取日期、读合并单元格内容。
下面先看看基本的操作:


图表数据

整体思路为,打开文件,选定表格,读取行列内容,读取表格内数据
详细代码如下:
import xlrdfrom datetime import date,datetime
file = 'test3.xlsx'
def read_excel():
wb = xlrd.open_workbook(filename=file)#打开文件 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(rows) print(cols)
print(sheet1.cell(1,0).value)#获取表格里的内容,三种方式 print(sheet1.cell_value(1,0)) print(sheet1.row(1)[0].value)

运行结果如下:



那么问题来了,上面的运行结果中红框框中的字段明明是出生日期,可显示的确实浮点数;同时合并单元格里面应该是有内容的,结果不能为空。


别急,我们来一一解决这两个问题:


1.python读取excel中单元格内容为日期的方式


python读取excel中单元格的内容返回的有5种类型,即上面例子中的ctype:

ctype :  0 empty,1 string,2 number, 3 date,4 boolean,5 error

即date的ctype=3,这时需要使用xlrd的xldate_as_tuple来处理为date格式,先判断表格的ctype=3时xldate才能开始操作。


详细代码如下:

import xlrd
from datetime import date,datetime
print(sheet1.cell(1,2).ctype) date_value = xlrd.xldate_as_tuple(sheet1.cell_value(1,2),wb.datemode) print(date_value) print(date(*date_value[:3])) print(date(*date_value[:3]).strftime('%Y/%m/%d'))



2.获取合并单元格的内容

在操作之前,先介绍一下merged_cells()用法,merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一样,即(1, 3, 4, 5)的含义是:第1到2行(不包括3)合并,(7, 8, 2, 5)的含义是:第2到4列合并。

详细代码如下:
print(sheet1.merged_cells)print(sheet1.cell_value(1,3))print(sheet1.cell_value(4,3))print(sheet1.cell_value(6,1))



发现规律了没?是的,获取merge_cells返回的row和col低位的索引即可! 于是可以这样批量获取:

详细代码如下:
merge = []print(sheet1.merged_cells)for (rlow,rhigh,clow,chigh) in sheet1.merged_cells:     merge.append([rlow,clow])for index in merge:     print(sheet1.cell_value(index[0],index[1]))

运行结果跟上图一样,如下:



Python读写Excel表格,就是这么简单粗暴又好用,如果觉得不错,对你工作中有帮助,动动手指分享给更多人哦。

推荐阅读:

Python 为什么推荐蛇形命名法?
去年最畅销的IT类新书《漫画算法》出Python版了!
人人都欠微软一个正版?



👇👇👇👇👇







今日福利 

python入门到人工智能实战》是针对零基础编程学习者编写的教程。从初学者角度出发,每章以问题为导向,辅以大量的实例,详细地介绍了Python 基础、机器学习,以及最好也最易学习的两个平台PyTorch 和Keras。

Python人工智能开发从入门到精通》主要介绍了Python进行人工智能开发所需的技术、基础设施、核心理念、实施方法与流程,以及实战操作应用。


  留言赠书参与方法 


分享一下你在学习使用Python的经验感受,或者其他的工作学习经验,活动截止时我们将选择5名小锦鲤获得以上书籍中的任一本书

截止时间:2020 年 08 月 18 日 16:00 整


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72570
 
534 次点击