Python操作Excel之读与写

2024-01-22 21:59
文章标签 python excel 操作 之读

本文主要是介绍Python操作Excel之读与写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

python读excel——xlrd

这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。下面先看看基本的操作:

首先读一个excel文件,有两个sheet,测试用第二个sheet,sheet2内容如下:

python 对 excel基本的操作如下:

复制代码

# -*- coding: utf-8 -*-
import xlrd
import xlwt
from datetime import date,datetimedef read_excel():# 打开文件workbook = xlrd.open_workbook(r'F:\demo.xlsx')# 获取所有sheetprint workbook.sheet_names() # [u'sheet1', u'sheet2']sheet2_name = workbook.sheet_names()[1]# 根据sheet索引或者名称获取sheet内容sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始sheet2 = workbook.sheet_by_name('sheet2')# sheet的名称,行数,列数print sheet2.name,sheet2.nrows,sheet2.ncols# 获取整行和整列的值(数组)rows = sheet2.row_values(3) # 获取第四行内容cols = sheet2.col_values(2) # 获取第三列内容print rowsprint cols# 获取单元格内容print sheet2.cell(1,0).value.encode('utf-8')print sheet2.cell_value(1,0).encode('utf-8')print sheet2.row(1)[0].value.encode('utf-8')# 获取单元格内容的数据类型print sheet2.cell(1,0).ctypeif __name__ == '__main__':read_excel()

复制代码

运行结果如下:

 

那么问题来了,上面的运行结果中红框框中的字段明明是出生日期,可显示的确实浮点数。好的,来解决第一个问题:

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才能开始操作。现在命令行看下:

复制代码

>>> sheet2.cell(2,2).ctype  #1990/2/22
3
>>> sheet2.cell(2,1).ctype  #24
2
>>> sheet2.cell(2,0).ctype  #小胖
1
>>> sheet2.cell(2,4).ctype  #空值(这里是合并单元格的原因)
0
>>> sheet2.cell(2,2).value  #1990/2/22
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),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,则用时间格式处理:

if (sheet.cell(row,col).ctype == 3):date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')

 

那么问题又来了,上面 sheet2.cell(2,4).ctype 返回的值是0,说明这个单元格的值是空值,明明是合并的单元格内容"好朋友",这个是我觉得这个包功能不完善的地方,如果是合并的单元格那么应该合并的单元格的内容一样,但是它只是合并的第一个单元格的有值,其它的为空。

复制代码

>>> sheet2.col_values(4)
[u'\u5173\u7cfb', u'\u597d\u670b\u53cb', '', u'\u540c\u5b66', '', '', u'\u4e00\u4e2a\u4eba', '']
>>> for i in range(sheet2.nrows):print sheet2.col_values(4)[i]
关系
好朋友同学一个人>>> sheet2.row_values(7)
[u'\u65e0\u540d', 20.0, u'\u6682\u65e0', '', '']
>>> for i in range(sheet2.ncols):print sheet2.row_values(7)[i]
无名
20.0
暂无>>> 

复制代码

 

2、读取合并单元格的内容

这个是真没技巧,只能获取合并单元格的第一个cell的行列索引,才能读到值,读错了就是空值。

即合并行单元格读取行的第一个索引,合并列单元格读取列的第一个索引,如上述,读取行合并单元格"好朋友"和读取列合并单元格"暂无"只能如下方式:

复制代码

>>> print sheet2.col_values(4)[1]
好朋友
>>> print sheet2.row_values(7)[2]
暂无

 >>> sheet2.merged_cells # 明明有合并的单元格,为何这里是空
 []

复制代码

疑问又来了,合并单元格可能出现空值,但是表格本身的普通单元格也可能是空值,要怎么获取单元格所谓的"第一个行或列的索引"呢?

这就要先知道哪些是单元格是被合并的!

 

3、获取合并的单元格

读取文件的时候需要将formatting_info参数设置为True,默认是False,所以上面获取合并的单元格数组为空,

>>> workbook = xlrd.open_workbook(r'F:\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也是一样,即(1, 3, 4, 5)的含义是:第1到2行(不包括3)合并,(7, 8, 2, 5)的含义是:第2到4列合并。

利用这个,可以分别获取合并的三个单元格的内容:

>>> print sheet2.cell_value(1,4)   #(1, 3, 4, 5)
好朋友
>>> print sheet2.cell_value(3,4)   #(3, 6, 4, 5)
同学
>>> print sheet2.cell_value(7,2)   #(7, 8, 2, 5)
暂无

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

复制代码

>>> merge = []
>>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:merge.append([rlow,clow])>>> merge
[[7, 2], [1, 4], [3, 4]]
>>> for index in merge:print sheet2.cell_value(index[0],index[1])暂无
好朋友
同学
>>> 

复制代码

 

python写excel——xlwt

写excel的难点可能不在构造一个workbook的本身,而是填充的数据,不过这不在范围内。在写excel的操作中也有棘手的问题,比如写入合并的单元格就是比较麻烦的,另外写入还有不同的样式。这些要看源码才能研究的透。

我"构思"了如下面的sheet1,即要用xlwt实现的东西:

基本上看起来还算复杂,而且看起来"很正规",完全是个人杜撰。

代码如下:

复制代码

'''
设置单元格样式
'''def set_style(name,height,bold=False):style = xlwt.XFStyle()  # 初始化样式font = xlwt.Font()  # 为样式创建字体font.name = name # 'Times New Roman'font.bold = boldfont.color_index = 4font.height = height# borders= xlwt.Borders()# borders.left= 6# borders.right= 6# borders.top= 6# borders.bottom= 6style.font = font# style.borders = bordersreturn style#写excel
def write_excel():f = xlwt.Workbook() #创建工作簿'''创建第一个sheet:sheet1'''sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheetrow0 = [u'业务',u'状态',u'北京',u'上海',u'广州',u'深圳',u'状态小计',u'合计']column0 = [u'机票',u'船票',u'火车票',u'汽车票',u'其它']status = [u'预订',u'出票',u'退票',u'业务小计']#生成第一行for i in range(0,len(row0)):sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))#生成第一列和最后一列(合并4行)i, j = 1, 0while i < 4*len(column0) and j < len(column0):sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列sheet1.write_merge(i,i+3,7,7) #最后一列"合计"i += 4j += 1sheet1.write_merge(21,21,0,1,u'合计',set_style('Times New Roman',220,True))#生成第二列i = 0while i < 4*len(column0):for j in range(0,len(status)):sheet1.write(j+i+1,1,status[j])i += 4f.save('demo1.xlsx') #保存文件if __name__ == '__main__':#generate_workbook()#read_excel()write_excel()

复制代码

需要稍作解释的就是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,则只要f.add_sheet即可。

如在上述write_excel函数里f.save('demo1.xlsx') 这句之前再创建一个sheet2,效果如下:

代码也是真真的easy的了:

复制代码

    '''创建第二个sheet:sheet2'''sheet2 = f.add_sheet(u'sheet2',cell_overwrite_ok=True) #创建sheet2row0 = [u'姓名',u'年龄',u'出生日期',u'爱好',u'关系']column0 = [u'小杰',u'小胖',u'小明',u'大神',u'大仙',u'小敏',u'无名']#生成第一行for i in range(0,len(row0)):sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True))#生成第一列for i in range(0,len(column0)):sheet2.write(i+1,0,column0[i],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') #保存文件

复制代码

 

 还可以添加超链接,如:

   # 添加超链接n= "HYPERLINK"sheet2.write_merge(9,9,2,8, xlwt.Formula(n +'("http://www.cnblogs.com/zhoujie";"jzhou\'s blog")'),set_style('Arial',300,True))sheet2.write_merge(10,10, 2, 8, xlwt.Formula(n +'("mailto:zhoujie0111@126.com";"contact me")'),set_style('Arial',300,True))

 

完整代码:

复制代码

# -*- coding: utf-8 -*-
import xlwt
import xlrd'''
设置单元格样式
'''def set_style(name,height,bold=False):style = xlwt.XFStyle()  # 初始化样式font = xlwt.Font()  # 为样式创建字体font.name = name # 'Times New Roman'font.bold = bold#f.underline= Font.UNDERLINE_DOUBLEfont.color_index = 4font.height = height# borders= xlwt.Borders()# borders.left= 6# borders.right= 6# borders.top= 6# borders.bottom= 6style.font = font# style.borders = bordersreturn style#读excel
def read_excel():# 打开文件workbook = xlrd.open_workbook(r'F:\demo.xlsx')# 获取所有sheetprint workbook.sheet_names() # [u'sheet1', u'sheet2']sheet2_name = workbook.sheet_names()[1]# 根据sheet索引或者名称获取sheet内容sheet2 = workbook.sheet_by_index(1) #sheet索引从0开始sheet2 = workbook.sheet_by_name('sheet2')# sheet的名称,行数,列数print sheet2.name,sheet2.nrows,sheet2.ncols# 获取整行和整列的值(数组)rows = sheet2.row_values(3) #获取第四行内容cols = sheet2.col_values(2) #获取第三列内容print rowsprint cols# 获取单元格内容print sheet2.cell(1,0).value.encode('utf-8')print sheet2.cell_value(1,0).encode('utf-8')print sheet2.row(1)[0].value.encode('utf-8')# 获取单元格内容的数据类型print sheet2.cell(1,0).ctype#写excel
def write_excel():f = xlwt.Workbook() #创建工作簿'''创建第一个sheet:sheet1'''sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheetrow0 = [u'业务',u'状态',u'北京',u'上海',u'广州',u'深圳',u'状态小计',u'合计']column0 = [u'机票',u'船票',u'火车票',u'汽车票',u'其它']status = [u'预订',u'出票',u'退票',u'业务小计']#生成第一行for i in range(0,len(row0)):sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))#生成第一列和最后一列(合并4行)i, j = 1, 0while i < 4*len(column0) and j < len(column0):sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列sheet1.write_merge(i,i+3,7,7) #最后一列"合计"i += 4j += 1sheet1.write_merge(21,21,0,1,u'合计',set_style('Times New Roman',220,True))#生成第二列i = 0while i < 4*len(column0):for j in range(0,len(status)):sheet1.write(j+i+1,1,status[j])i += 4'''创建第二个sheet:sheet2'''sheet2 = f.add_sheet(u'sheet2',cell_overwrite_ok=True) #创建sheetrow0 = [u'姓名',u'年龄',u'出生日期',u'爱好',u'关系']column0 = [u'小杰',u'小胖',u'小明',u'大神',u'大仙',u'小敏',u'无名']#生成第一行for i in range(0,len(row0)):sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True))#生成第一列for i in range(0,len(column0)):sheet2.write(i+1,0,column0[i],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'好朋友') #合并行单元格# 插入图片sheet2.insert_bitmap(r'F:\1.bmp',10,2) # 添加超链接n= "HYPERLINK"sheet2.write_merge(9,9,2,8, xlwt.Formula(n +'("http://www.cnblogs.com/zhoujie";"jzhou\'s blog")'),set_style('Arial',300,True))sheet2.write_merge(10,10, 2, 8, xlwt.Formula(n +'("mailto:zhoujie0111@126.com";"contact me")'),set_style('Arial',300,True))f.save('demo1.xlsx') #保存文件if __name__ == '__main__':read_excel()write_excel()

复制代码

这篇关于Python操作Excel之读与写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634365

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字