python处理excel文件(xls和xlsx)

一、xlrd和xlwt

使用之前需要需要先安装,windows上如果直接在cmd中运行python则需要先执行pip3 install xlrd和pip3 install xlwt,如果使用pycharm则需要在项目的解释器中安装这两个模块,File-Settings-Project:layout-Project Interpreter,点击右侧界面的+号,然后搜索xlrd和xlwt,然后点击Install Package进行安装。

 

对于excel来说,整个excel文件称为工作簿,工作簿中的每个页称为工作表,工作表又由单元格组成。

对于xlrd和xlwt,行数和列数从0开始,单元格的行和列也从0开始,例如sheet.row_values(2)表示第三行的内容,sheet.cell(1,2).value表示第二行第三列单元格的内容

1.xlrd模块读取excel文件

使用xlrd模块之前需要先导入import xlrd,xlrd模块既可读取xls文件也可读取xlsx文件

获取工作簿对象:book = xlrd.open_workbook('excel文件名称')

获取所有工作表名称:names = book.sheet_names(),结果为列表

根据索引获取工作表对象:sheet = book.sheet_by_index(i)

根据名称获取工作表对象:sheet = book.sheet_by_name('工作表名称')

获取工作表行数:rows = sheet.nrows

获取工作表列数:cols = sheet.ncols

获取工作表某一行的内容:row = sheet.row_values(i) ,结果为列表   【sheet.row(i),列表】

获取工作表某一列的内容:col = sheet.col_values(i)  结果为列表   【sheet.col(i),列表】

获取工作表某一单元格的内容:cell = sheet.cell_value(m,n)、 sheet.cell(m,n).value、sheet.row(m)[n].value,sheet.col(n)[m].value,结果为字符串或数值    【sheet.cell(0,0),xlrd.sheet.Cell对象

示例:假设在py执行文件同层目录下有一fruit.xls文件,有三个sheet页Sheet1、Sheet2、Sheet3,其中Sheet1内容如下:

 

import xlrd
book = xlrd.open_workbook('fruit.xls')
print('sheet页名称:',book.sheet_names())
sheet = book.sheet_by_index(0)
rows = sheet.nrows
cols = sheet.ncols
print('该工作表有%d行,%d列.'%(rows,cols))
print('第三行内容为:',sheet.row_values(2))
print('第二列内容为%s,数据类型为%s.'%(sheet.col_values(1),type(sheet.col_values(1))))
print('第二列内容为%s,数据类型为%s.'%(sheet.col(1),type(sheet.col(1))))
print('第二行第二列的单元格内容为:',sheet.cell_value(1,1))
print('第三行第二列的单元格内容为:',sheet.cell(2,1).value)
print('第五行第三列的单元格内容为:',sheet.row(4)[2].value)
print('第五行第三列的单元格内容为%s,数据类型为%s'%(sheet.col(2)[4].value,type(sheet.col(2)[4].value)))
print('第五行第三列的单元格内容为%s,数据类型为%s'%(sheet.col(2)[4],type(sheet.col(2)[4])))# 执行结果
# sheet页名称: ['Sheet1', 'Sheet2', 'Sheet3']
# 该工作表有5行,3列.
# 第三行内容为: ['梨', 3.5, 130.0]
# 第二列内容为['单价/元', 8.0, 3.5, 4.5, 3.8],数据类型为<class 'list'>.
# 第二列内容为[text:'单价/元', number:8.0, number:3.5, number:4.5, number:3.8],数据类型为<class 'list'>.
# 第二行第二列的单元格内容为: 8.0
# 第三行第二列的单元格内容为: 3.5
# 第五行第三列的单元格内容为: 300.0
# 第五行第三列的单元格内容为300.0,数据类型为<class 'float'>
# 第五行第三列的单元格内容为number:300.0,数据类型为<class 'xlrd.sheet.Cell'>
xlrd读取excel示例

 

可以看出,通过sheet.row(i)、sheet.col(i)也可以获取行或列的内容,并且结果也是一个列表,但是列表中的每一项类似字典的键值对,形式为数据类型:值

而sheet.cell(0,0)获取单元格内容,结果是一个键值对,并且是一个xlrd.sheet.Cell对象。

 

2.xlwt写入excel文件

使用xlwt模块之前需要先导入import xlwt,xlwt模块只能写xls文件,不能写xlsx文件(写xlsx程序不会报错,但最后文件无法直接打开,会报错)。

创建工作簿:book = xlwt.Workbook(),如果写入中文为乱码,可添加参数encoding = 'utf-8'

创建工作表:sheet = book.add_sheet('Sheet1')

向单元格写入内容:sheet.write(m,n,'内容1')、sheet.write(x,y,'内容2')

保存工作簿:book.save('excel文件名称'),默认保存在py文件相同路径下,如果该路径下有相同文件,会被新创建的文件覆盖,即xlwt不能修改文件

import xlwt
book = xlwt.Workbook()
sheet = book.add_sheet('Sheet1')
sheet.write(0,0,'hello')
sheet.write(1,0,'你好')
book.save('hello.xls')
xlwt创建并写入excel示例

 

逐个单元格写入excel比较麻烦,可以按行或者列写入。

import xlwt
proj = ['名称','单价/元','库存/kg']
fruit = ['苹果','','香蕉','橘子']
price = [8,3.5,4.5,3.8]
storage = [150,130,100,300]
book = xlwt.Workbook()
sheet = book.add_sheet('Sheet1')
for i in range(0,len(proj)):sheet.write(0,i,proj[i]) #按行插入行标题
for i in range(0,len(fruit)):sheet.write(i+1,0,fruit[i])  #插入第一列水果名称
for i in range(0,len(price)):sheet.write(i+1,1,price[i])  #插入第二列单价
for i in range(0,len(storage)):sheet.write(i+1,2,storage[i])   #插入第三列库存
book.save('fruit2.xls')
xlwt逐行或列写入excel

 

二、openpyxl模块

openpyxl模块可实现对excel文件的读、写和修改,只能处理xlsx文件,不能处理xls文件。使用openpyxl模块之前同样需要先安装该模块,再导入 import openpyxl。

对于openpyxl,行数和列数都从1开始,单元格的行和列也从0开始。例如sheet.cell(1,2).value表示第一行第二列单元格的内容

1.openpyxl读取excel文件

获取工作簿对象:book = openpyxl.load_workbook('excel文件名称')

获取所有工作表名称:names = book.sheetnames

获取工作表对象:sheet1 = book.worksheets[n]、sheet2 = book['工作表名称']、sheet3 = book[book.sheetnames[n]]

获取工作表名称:title = sheet1.title

获取工作表行数:rows = sheet1.max_row

获取工作表列数:cols = sheet1.max_column

获取某一单元格内容:cell = sheet.cell(1,2).value、sheet['单元格'].value例如sheet['B1'].value

假设有一fruit2.xlsx,除后缀名其他与上述fruit.xls完全一样

import openpyxl
book = openpyxl.load_workbook('fruit2.xlsx')
print('所有sheet页名称:',book.sheetnames)  
sheet = book.worksheets[0]
sheet2 = book['Sheet1']
sheet3 = book[book.sheetnames[0]]
print('工作表名称:',sheet3.title)
rows = sheet.max_row
cols = sheet.max_column
print('该工作表有%d行,%d列.'%(rows,cols))# 执行结果
# 所有sheet页名称: ['Sheet1', 'Sheet2', 'Sheet3']
# 工作表名称: Sheet1
# 该工作表有5行,3列.
openpyxl读取excel示例

 

2.行和列生成器

对于xlrd模块来说,可直接通过sheet.row[i]和sheet.col[i]获取行和列的内容,但是对于openpyxl模块来说,无法直接获取某一行或列的内容,openpyxl模块的sheet.rows和sheet.columns表示行和列的生成器,即generator object,需要通过循环或转换成列表、元组的形式得到行或列的值。

print(sheet.rows,sheet.columns)
for col in sheet.columns:print(col)
for row in sheet.rows:for i in row:print(i.value,end='  ')print()# 执行结果
# <generator object Worksheet._cells_by_row at 0x00000230E011A2A0> <generator object Worksheet._cells_by_col at 0x00000230E102FC00>
# (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>, <Cell 'Sheet1'.A5>)
# (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.B5>)
# (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.C5>)
# 名称  单价/元  库存/kg
# 苹果  8  150
# 梨  3.5  130
# 香蕉  4.5  100
# 橘子  3.8  300
openpyxl的行和列生成器

 

如果要获取某一行或者列的内容,可将行、列生成器对象转换成列表或者元组,再循环列表或者元组得到内容。

前面说过openpyxl模块的行和列都从1开始,但是由于将生成器转化成了列表list(sheet.rows),而列表的索引从0开始,因此list(sheet.rows)[1]还是表示第二行的内容,不是第一行的内容。

for i in list(sheet.rows)[1]:print(i.value,end='  ')
print()
for i in list(sheet.columns)[0]:print(i.value,end='  ')# 执行结果
# 苹果  8  150
# 名称  苹果  梨  香蕉  橘子
获取某一行或者列的内容

 

获取单元格的内容

print(sheet.cell(1,2).value)  #第一行第二列单元格的内容
print(sheet['a2'].value)  #使用excel单元格的表示法,字母不区分大小写

 

3.openpyxl写excel文件 

创建工作簿:book = openpyxl.Workbook(),如果写入中文为乱码,可添加参数encoding = 'utf-8'

创建工作表:sheet = book.create_sheet('工作表名称',0),0表示创建的工作表在工作薄最前面

向单元格写入内容:sheet.write(m,n,'内容1')、sheet.write(x,y,'内容2')

保存工作簿:book.save('excel文件名称'),默认保存在py文件相同路径下,如果该路径下有相同文件,会被新创建的文件覆盖。

book = openpyxl.Workbook()
sheet = book.create_sheet('Sheet1',0)
proj = ['名称','单价/元','库存/kg']
fruit = ['苹果','香蕉','','橘子']
price = [8,3.5,4.5,3.8]
storage = [150,130,300,100]
for i in range(len(proj)):sheet.cell(1,i+1,proj[i])
for i in range(len(fruit)):sheet.cell(i+2,1,fruit[i])
for i in range(len(price)):sheet.cell(i+2,2,price[i])
for i in range(len(storage)):sheet.cell(i+2,3,storage[i])
book.save('fruit2.xlsx')
openpyxl创建和写excel示例

 

4.openpyxl修改excel文件

sheet.insert_rows(m)和sheet.insert_cols(n)分别表示在第m行、第n列前面插入行、列

sheet.delete_rows(m)和sheet.delete_cols(n)分别表示删除第m行、第n列

rows = sheet.max_row
sheet.insert_rows(rows+2)
cherry = ['樱桃',17,80]  
for j in cherry:sheet.cell(rows+1,cherry.index(j)+1,j)
book.save('fruit2.xlsx')
openpyxl在指定位置增加行

 

修改单元格内容:sheet.cell(m,n) = '内容1'或者sheet['B3'] = '内容2' 

sheet.cell(3,2,4)
sheet['B3'] = 5
book.save('fruit2.xlsx')
openpyxl修改单元格的内容

 

在最后追加行:sheet.append(可迭代对象)

straberry = ['草莓',20,50]
sheet.append(straberry)
book.save('fruit2.xlsx')
append在最后追加行

 

xlrd、xlwt和openpyxl处理excel文件,在写入文件的时候不如pandas简单,pandas处理excel文件见另外一篇博客https://www.cnblogs.com/Forever77/p/11298173.html

 

转载于:https://www.cnblogs.com/Forever77/p/11135124.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html块中的内容垂直居中,css如何设置行内元素与块级元素的内容垂直居中

首先我们先了解一下行内元素和块级元素行内元素(内联元素)&#xff1a;没有自己的独立空间&#xff0c;它是依附于其他块级元素存在的&#xff0c;空间大小依附于内容多少。行内元素没有度、宽度、内外边距等属性。块级元素&#xff1a;占据独立的空间&#xff0c;具有宽度&…

Mina、Netty、Twisted一起学(五):整合protobuf

protobuf是谷歌的Protocol Buffers的简称&#xff0c;用于结构化数据和字节码之间互相转换&#xff08;序列化、反序列化&#xff09;&#xff0c;一般应用于网络传输&#xff0c;可支持多种编程语言。protobuf怎样使用这里不再介绍&#xff0c;本文主要介绍在MINA、Netty、Twi…

leetcode 1. 两数之和(map)

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11, 15], target …

Redis 3.0.1 安装和配置

一、下载&#xff0c;解压和编译Redis 12345# cd /tmp # wget http://download.redis.io/releases/redis-3.0.1.tar.gz # tar xzf redis-3.0.1.tar.gz # cd redis-3.0.1 # make二、下载、安装tclsh 测试编译&#xff1a; 1# make test得到如下错误信息&#xff1a; …

2021年南宁二中高考成绩查询,2021广西高考圆满结束,6月23日可查询成绩

6月8日下午&#xff0c;2021年高考统考圆满结束。今年广西参加高考统考考生人数40.05万余人&#xff0c;比2020年增加了2.2万人。我区预计6月23日可查询高考成绩&#xff0c;6月24日起可陆续填报志愿&#xff0c;我区的网上咨询会将于6月25日至27日举办。▲高考结束&#xff0c…

29 Python - 字符与编码

字符与编码 01 字符串本质 Python字符串相关概念 字符串 str 字节 bytes 字节数组 bytearray 电脑字符串存储机制 字符库&#xff1a;A、B每个字符有一个代码点如A是65 B为66&#xff0c;这种是方便人类读写的形式&#xff0c;但是最终需要存入计算机的CPU和内存&…

Linux 内存管理与系统架构设计

Linux 提供各种模式&#xff08;比如&#xff0c;消息队列&#xff09;&#xff0c;但是最著名的是 POSIX 共享内存&#xff08;shmem&#xff0c;shared memory&#xff09;。 Linux provides a variety of schemes (such as message queues), but most notable is POSIX shar…

如何正确使用Node.js中的事件

by Usama Ashraf通过Usama Ashraf 如何正确使用Node.js中的事件 (How to use events in Node.js the right way) Before event-driven programming became popular, the standard way to communicate between different parts of an application was pretty straightforward: …

你的成功有章可循

读书笔记 作者 海军 海天装饰董事长 自我修炼是基础。通过自我学习&#xff0c;在预定目标的指引下&#xff0c;将获取的知识转化为个人能力&#xff0c;形成自我规律&#xff0c;不断循环&#xff0c;实现成功。 寻找和掌握规律&#xff0c;并熟练运用于实践&#xff0c;是成功…

98k用计算机图片,98K (HandClap)_谱友园地_中国曲谱网

《98K》文本歌词98K之歌-HandClap-抖音 制谱&#xff1a;孙世彦这首《HandClap》是Fitz&TheTantrums乐队演唱的一首歌曲&#xff0c;同时也是绝地求生中嚣张BGM&#xff0c;是一首吃鸡战歌&#xff01;这首歌谱曲者和填词者都是三个人&#xff1a;JeremyRuzumna&#xff0c…

qt之旅-1纯手写Qt界面

通过手写qt代码来认识qt程序的构成&#xff0c;以及特性。设计一个查找对话框。以下是设计过程1 新建一个empty qt project2 配置pro文件HEADERS \Find.h QT widgetsSOURCES \Find.cpp \main.cpp3 编写对话框的类代码例如以下&#xff1a;//Find.h #ifndef FIND_H #define F…

【随笔】写在2014年的第一天

想想好像就在不久前还和大家异常兴奋地讨论着世界末日的事&#xff0c;结果一晃也是一年前的事了。大四这一年&#xff0c;或者说整个2013年都是场摇摆不定的戏剧&#xff0c;去过的地方比前三年加起来还多的多&#xff0c;有时候也会恍惚地不知道自己现在在哪。简单记几笔&…

设计冲刺下载_如何运行成功的设计冲刺

设计冲刺下载by George Krasadakis通过乔治克拉萨达基斯(George Krasadakis) Design Sprints can generate remarkable output for your company — such as a backlog of impactful ideas, functional prototypes, learning and key insights from customers along with real…

leetcode 18. 四数之和(双指针)

给定一个包含 n 个整数的数组 nums 和一个目标值 target&#xff0c;判断 nums 中是否存在四个元素 a&#xff0c;b&#xff0c;c 和 d &#xff0c;使得 a b c d 的值与 target 相等&#xff1f;找出所有满足条件且不重复的四元组。 注意&#xff1a; 答案中不可以包含重…

WPF:从WPF Diagram Designer Part 4学习分组、对齐、排序、序列化和常用功能

在前面三篇文章中我们介绍了如何给图形设计器增加移动、选择、改变大小及面板、缩略图、框线选择和工具箱和连接等功能&#xff0c;本篇是这个图形设计器系列的最后一篇&#xff0c;将和大家一起来学习一下如何给图形设计器增加分组、对齐、排序、序列化等功能。 WPF Diagram D…

win7如何看计算机用户名和密码怎么办,win7系统电脑查看共享文件夹时不显示用户名和密码输入窗口的解决方法...

win7系统使用久了&#xff0c;好多网友反馈说win7系统电脑查看共享文件夹时不显示用户名和密码输入窗口的问题&#xff0c;非常不方便。有什么办法可以永久解决win7系统电脑查看共享文件夹时不显示用户名和密码输入窗口的问题&#xff0c;面对win7系统电脑查看共享文件夹时不显…

ASP.NET Core跨域设置

项目中经常会遇到跨域问题&#xff0c;解决方法&#xff1a; 在appsettings.json 文件中添加json项 {"Logging": {"LogLevel": {"Default": "Warning"}},"AllowedHosts": "*","AppCores": "https…

微信客户端<->腾讯微信服务器<->开发者服务器

出自 http://blog.csdn.net/hanjingjava/article/details/41653113 首先&#xff0c;通过Token验证&#xff0c;将公众号接入开发者服务器&#xff0c;这样客户端发给公众号的信息会被转发给开发者服务器&#xff1b; 第二&#xff0c;组装微信特定消息格式&#xff0c;返回给用…

idea提高调试超时_如何提高您的调试技能

idea提高调试超时by Nick Karnik尼克卡尼克(Nick Karnik) 如何提高您的调试技能 (How to Improve Your Debugging Skills) All of us write code that breaks at some point. That is part of the development process. When you run into an error, you may feel that you do…

leetcode 834. 树中距离之和(dp)

给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 。第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。示例 1:输入: N 6, edges [[0,1],[0,2],[2,3],[2,4],[2,5]] 输出: [8,12,6,10,10,10] 解…