一、python操作excel之openpyxl
前言
根据官方文档,openpyxl 是一个第三方库, 它可以可以处理 xlsx/xlsm 格式的 Excel 文件(A Python library to read/write Excel 2010 xlsx/xlsm files)。
openpyxl 中主要的三个概念: Workbook(工作表),Sheet(表页)和Cell(格)。
openpyxl 中主要的操作: 打开 Workbook,定位 Sheet,操作 Cell。
(1)支持excel格式
xlsx
xlsm
xltx
xltm
(2)基本用法
首先介绍下Excel的一些基本概念,Workbook相当于是一个文件,WorkSheet就是文件里面的每个具体的表,比如新建Excel文件里面的'Sheet1'这个,一个Workbook里面有一个或多个WorkSheet.
workbook: 工作簿,一个excel文件包含多个sheet。
worksheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。
cell: 单元格,存储数据对象
1、安装openpyxl
pip install openpyxl
2、参数介绍
(一)常遇到的情况
就我自己来说,常遇到的情况可能就下面几种:
读取excel整个sheet页的数据。
读取指定行、列的数据
往一个空白的excel文档写数据
往一个已经有数据的excel文档追加数据
下面就以这几种情况为例进行说明。
(二) 涉及的模块及函数说明
就我知道的,有3个模块可以操作excel文档,3个模块通过pip都可以直接安装。
xlrd:读数据
xlwt:写数据
openpyxl:可以读数据,也可以写数据
这里就就只说明openpyxl了,因为这个模块能满足上面的需要了。
openpyxl函数
函数
说明
load_workbook(filename)
打开excel,并返回所有sheet页访问指定sheet页的方法:*#打开excel文档 wb = openpyxl.load_workbook(file_name)#访问sheet页 *sheet = wb[‘sheet页的名称’]#关闭excel文档wb.close()
Workbook()
创建excel文档wb = openpyxl.Workbook()#保存excel文档wb.save('文件名.xlsx')
下面的函数是针对sheet页的sheet = wb[‘sheet页的名称’]访问指定单元格的方式sheet['A1']、sheet['B1']...
min_row
返回包含数据的最小行索引,索引从1开始例如:sheet.min_row
max_row
返回包含数据的最大行索引,索引从1开始
min_column
返回包含数据的最小列索引,索引从1开始
max_column
返回包含数据的最大列索引,索引从1开始
values
获取excel文档所有的数据,返回的是一个generator对象
iter_rows(min_row=None, max_row=None, min_col=None, max_col=None)
min_row:最小行索引max_row:最大行索引min_col:最小列索引max_col:最大列索引获取指定行、列的单元格,没指定就是获取所有的
title
WorkSheet的名称
现在我有这么一个excel,下面以这个excel进行说明。
3、读取文件属性
import openpyxl
# 打开一个EXcel文档
wb = openpyxl.load_workbook('test.xlsx')
sheet2 = wb['Sheet2']
print('表名为:',sheet2.title)
print('数据的行数和列数:',sheet2.dimensions)
print('最小行数为:',sheet2.max_row)
print('最大行数为:',sheet2.min_row)
print('最大列数为:',sheet2.max_column)
print('最小列数为:',sheet2.min_column)
# 获取指定单元格
print('单元格A1:',sheet2['A1'])
print('单元格B1:',sheet2.cell(row=1, column=2))
# 获取行
print('行:',sheet2.rows)
# 获取列
print('列:',sheet2.columns)
# 获取所有的数据
print('所有的数据:',sheet2.values)
# 查看Excel文档的属性
print('是否只读:',wb.read_only)
print('文档的属性:',wb.properties)
#文档的字符集格式
print('字符集格式:',wb.encoding)
# 获取活跃的工作表
print('活跃的工作表:',wb.active)
# 获取所有的工作表
print('所有的工作表:',wb.worksheets)
# 获取所有的工作表的名称
print('输出文件所有工作表名:', wb.sheetnames)
# 根据表格名称获取worksheet对象,区分大小写
print('表名:',wb['Sheet2'])
输出结果为:
表名为: Sheet2
数据的行数和列数: A1:C8
最小行数为: 8
最大行数为: 1
最大列数为: 3
最小列数为: 1
单元格A1:
单元格B1:
行:
列:
所有的数据:
是否只读: False
文档的属性:
Parameters:
creator='小钢炮', title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2015, 6, 5, 18, 17, 20), modified=datetime.datetime(2020, 5, 7, 4, 9, 19), lastModifiedBy='xxx', category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None
字符集格式: utf-8
活跃的工作表:
所有的工作表: [
输出文件所有工作表名: ['Sheet2', 'Sheet3', '成绩表']
表名:
4、读取文件内容
import openpyxl
wb = openpyxl.load_workbook('test.xlsx')
sheet2 = wb['Sheet2']
# 获取单元格内容
# 方式一
print('方法一')
for row in sheet2.values:
print(*row)
print('=========================')
# 方式二
print('方法二')
for row in sheet2.rows:
print(*[cell.value for cell in row])
print('=========================')
# 方式三
print('方法三')
for row in sheet2.iter_rows():
print(*[cell.value for cell in row])
print('=========================')
# 方式四(最复杂,最原始)
print('方法四')
for i in range(sheet2.min_row, sheet2.max_row + 1):
for j in range(sheet2.min_column, sheet2.max_column + 1):
print(sheet2.cell(row=i,column=j).value,end=' ')
print()
输出结果为:
方法一
序号 姓名 年龄
1 发生的 25
2 浮动视 26
3 好的 27
4 经回复 28
5 好的话 29
6 套网 30
7 太温柔 31
=========================
方法二
序号 姓名 年龄
1 发生的 25
2 浮动视 26
3 好的 27
4 经回复 28
5 好的话 29
6 套网 30
7 太温柔 31
=========================
方法三
序号 姓名 年龄
1 发生的 25
2 浮动视 26
3 好的 27
4 经回复 28
5 好的话 29
6 套网 30
7 太温柔 31
=========================
方法四
序号 姓名 年龄
1 发生的 25
2 浮动视 26
3 好的 27
4 经回复 28
5 好的话 29
6 套网 30
7 太温柔 31
5、删除和创建表
import openpyxl
# 打开一个EXcel文档
wb = openpyxl.load_workbook('test.xlsx')
sheet2 = wb['Sheet2']
# 删除表
sheet1 = wb.get_sheet_by_name('Sheet1')
wb.remove_sheet(sheet1)
# 保存workbook的修改
wb.save('test.xlsx')
# 创建一个新的worksheet
wb.create_sheet('成绩表')
# 保存workbook的修改
wb.save('test.xlsx')
6、在Excel中存储学生成绩
import openpyxl
# 打开workbook
wb = openpyxl.load_workbook("成绩表.xlsx")
# #创建一个成绩表
# wb.create_sheet("学生成绩表")
#
# # 删除表
# wb.remove_sheet(wb['Sheet1'])
# 获取“学生成绩表”
score = wb["学生成绩表"]
# title = ['序号','姓名','语文','数学']
# no = range(6)
# names = ['张三','李四','王五','赵柳','田七']
# wen = [80,88,85,81,89]
# 第一行数据
score['A1'].value = '序号'
score['B1'].value = '姓名'
score['C1'].value = '语文'
score['D1'].value = '数学'
# 第二行数据
score['A2'].value = int('1')
score['B2'].value = '张三'
score['C2'].value = int('52')
score['D2'].value = int('64')
# 第三行数据
score['A3'].value = int('2')
score['B3'].value = '李四'
score['C3'].value = int('28')
score['D3'].value = int('95')
# 保存workbook
wb.save('成绩表.xlsx')
7、插入工作表内容
#coding=utf-8
import openpyxl
def process_worksheet(sheet):
# 总分所在的列
sum_column = sheet.max_column + 2
# 平均分所在的列
avg_column = sheet.max_column + 1
# 将总分和平均分保存到最后两列
for row in sheet.iter_rows(min_row=2, min_col=3):
# 单元格
score = [cell.value for cell in row]
# 总分
sum_score = sum(score)
# 平均分
avg_score = sum_score / len(score)
# 将总分和平均分保存到最后两列
sheet.cell(row=row[0].row, column=avg_column).value = avg_score
sheet.cell(row=row[0].row, column=sum_column).value = sum_score
# 设置平均分和总分的标题
sheet.cell(row=1, column=avg_column).value = "平均分"
sheet.cell(row=1, column=sum_column).value = "总分"
def main():
# 打开Excel文档
wb = openpyxl.load_workbook("成绩.xlsx")
# 获取一个工作表
sheet = wb["成绩表"]
# 把外部Excel文件(成绩表)中的sheet(成绩)插入当前Excel中
process_worksheet(sheet)
# 保存“练习.xlsx”
wb.save("练习-copy.xlsx")
if __name__ == '__main__':
main()
查看练习-copy.xlsx的数据
二、Python 读、写Excel文件(三种模块三种方式
python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别:
用xlrd和xlwt进行excel读写;
用openpyxl进行excel读写;
用pandas进行excel读写;
pandas介绍
Pandas是Python的一个数据分析包,该工具为解决数据分析任务而创建。
Pandas纳入大量库和标准数据模型,提供高效的操作数据集所需的工具。
Pandas提供大量能使我们快速便捷地处理数据的函数和方法。
Pandas是字典形式,基于NumPy创建,让NumPy为中心的应用变得更加简单。
1、xlrd模块
xlrd是用来从Excel中读写数据的,但我平常只用它进行读操作,写操作会遇到些问题。用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell)。下面举个例子,例如要打开当前目录下名为”data.xlsx”的Excel文件,选择第一张工作表,然后读取第一行的全部内容并打印出来。
#打开excel文件
data=xlrd.open_workbook('data.xlsx')
#获取第一张工作表(通过索引的方式)
table=data.sheets()[0]
#data_list用来存放数据
data_list=[]
#将table中第一行的数据读取并添加到data_list中
data_list.extend(table.row_values(0))
#打印出第一行的全部数据
for item in data_list:
print item
上面的代码中读取一行用table.row_values(number),类似的读取一列用table.column_values(number),其中number为行索引,在xlrd中行和列都是从0开始索引的,因此Excel中最左上角的单元格A1是第0行第0列。
xlrd中读取某个单元格用table.cell(row,col)即可,其中row和col分别是单元格对应的行和列。
下面简单归纳一下xlrd的用法
(1)安装xlrd模块
到python官网下载http://pypi.python.org/cmdpypi/xlrd模块安装,前提是已经安装了python 环境。
pip install xlrd
(2)使用技巧
sheet.name:sheet的名字
sheet.nrows:sheet的行数
sheet.ncols:sheet的列数
sheet.get_rows():返回一个迭代器,遍历所有行,给出每个行的值列表
sheet.row_values(index):返回某一行的值列表
sheet.row(index):返回一个row对象,可通过row[index]获取这行里的单元格cell对象
sheet.col_values(index):返回某一列的值列表
sheet.cell(row,col):获取一个cell对象(row和col都从0开始算
table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u'Sheet1')#通过名称获取
# 获取整行和整列的值(数组)
table.row_values(i)
table.col_values(i)
# 获取行数和列数
nrows = table.nrows
ncols = table.ncols
# 循环行列表数据
for i in range(nrows):
print table.row_values(i)
# 单元格
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(2,3).value
# 使用行列索引
cell_A1 = table.row(0)[0].value
cell_A2 = table.col(1)[0].value
# 简单的写入
row = 0
col = 0
# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
ctype = 1 value = '单元格的值'
xf = 0 # 扩展的格式化
table.put_cell(row, col, ctype, value, xf)
table.cell(0,0) #单元格的值'
table.cell(0,0).value #单元格的值'
(3)查看文件数据
import xlrd
book = xlrd.open_workbook('练习-copy.xlsx')
sheet1 = book.sheets()[0]
nrows = sheet1.nrows
print('表格总行数:', nrows)
ncols = sheet1.ncols
print('表格总列数:', ncols)
row3_values = sheet1.row_values(2)
print('第3行的值:', row3_values)
col3_values = sheet1.col_values(2)
print('第3列的值:', col3_values)
cell_2_2 = sheet1.cell(2,2).value
print('3行3列的值',cell_2_2)
输出结果如下
表格总行数: 8
表格总列数: 3
第3行的值: [2.0, '浮动视', 26.0]
第3列的值: ['年龄', 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0]
3行3列的值 26.0
2、xlwt模块
pip install xlwt
如果说xlrd不是一个单纯的Reader(如果把xlrd中的后两个字符看成Reader,那么xlwt后两个字符类似看成Writer),那么xlwt就是一个纯粹的Writer了,因为它只能对Excel进行写操作。xlwt和xlrd不光名字像,连很多函数和操作格式也是完全相同。下面简要归纳一下常用操作
(1)xlwt常用操作
新建一个Excel文件(只能通过新建写入)
data=xlwt.Workbook()
新建一个工作表
table=data.add_sheet('name')
写入数据到A1单元格
table.write(0,0,u'呵呵')
注意:如果对同一个单元格重复操作,会引发overwrite Exception,想要取消该功能,需要在添加工作表时指定为可覆盖,像下面这样
table=data.add_sheet('name',cell_overwrite_ok=True)
保存文件
data.save('test.xls')
这里只能保存扩展名为xls的,xlsx的格式不支持
xlwt支持一定的样式,操作如下
#初始化样式
style=xlwt.XFStyle()
#为样式创建字体
font=xlwt.Font()
#指定字体名字
font.name='Times New Roman'
#字体加粗
font.bold=True
#将该font设定为style的字体
style.font=font
#写入到文件时使用该样式
sheet.write(0,1,'just for test',style)
(2)实例
import xlwt # 貌似不支持excel2007的xlsx格式
wb = xlwt.Workbook()
wb_sheet = wb.add_sheet('ddd')
wb_sheet.write(0,0,'测试内容')
wb.save('d.xls')
查看d.xls文件
3、openpyxl模块
pip install openpyxl
该模块支持最新版的Excel文件格式,对Excel文件具有响应的读写操作,对此有专门的Reader和Writer两个类,便于对Excel文件的操作。虽然如此,但我一般还是用默认的workbook来进行操作。常用操作归纳如下:
(1)openpyxl常用操作
读取Excel文件
from openpyxl.reader.excel import load_workbook
wb=load_workbook(filename)
显示工作表的索引范围
wb.get_named_ranges()
显示所有工作表的名字
wb.get_sheet_names()
取得第一张表
sheetnames = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheetnames[0])
获取表名
ws.title
获取表的行数
ws.get_highest_row()
获取表的列数
ws.get_highest_column()
单元格的读取,此处和xlrd的读取方式很相近,都是通过行和列的索引来读取
#读取B1单元格中的内容
ws.cell(0,1).value
当然也支持通过Excel坐标来读取数据,代码如下
#读取B1单元格中的内容
ws.cell("B1").value
(2)实例
import pandas as pd
from pandas import DataFrame
# df = pd.read_excel(r'练习-copy.xlsx',sheet_name='学生成绩表')
# print(df.head())
data = {
'name':['张三','李四','王五'],
'age':[11,12,13],
'sex':['男','女','未知'],
}
df = DataFrame(data)
df.to_excel('new.xlsx')
查看new.xlsx文件
4、案例
把提供的原始Excel文档中的两个表格提取到另外一个新的Excel文档中,横向排列
代码如下:
import openpyxl
import pandas
from pandas import DataFrame
wb = openpyxl.load_workbook('Live数据库及表结构.xlsx')
sheet = wb['Sheet1']
aa = []
for row1 in sheet.iter_rows(min_row=3,max_row=6):
score1 = [cell.value for cell in row1]
aa.append(score1)
df = DataFrame(aa)
df.to_excel('xgp.xlsx')
bb = []
for row2 in sheet.iter_rows(min_row=8,max_row=14):
score2 = [cell.value for cell in row2]
bb.append(score2)
df = pandas.DataFrame(bb)
book = openpyxl.load_workbook('xgp.xlsx')
with pandas.ExcelWriter('xgp.xlsx')as E:
E.book = book
E.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(E,sheet_name='Sheet1',index=False,startcol=12)
查看xgp.xlsx文件
5、总结
读取Excel时,选择openpyxl和xlrd差别不大,都能满足要求
写入少量数据且存为xls格式文件时,用xlwt更方便
写入大量数据(超过xls格式限制)或者必须存为xlsx格式文件时,就要用openpyxl了。