python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

一、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进行说明。

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

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: <Cell 'Sheet2'.A1>
单元格B1: <Cell 'Sheet2'.B1>
行: <generator object Worksheet._cells_by_row at 0x000002612197F2E0>
列: <generator object Worksheet._cells_by_col at 0x000002612197F2E0>
所有的数据: <generator object Worksheet.values at 0x000002612197F2E0>
是否只读: False
文档的属性: <openpyxl.packaging.core.DocumentProperties object>
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
活跃的工作表: <Worksheet "成绩表">
所有的工作表: [<Worksheet "Sheet2">, <Worksheet "Sheet3">, <Worksheet "成绩表">]
输出文件所有工作表名: ['Sheet2', 'Sheet3', '成绩表']
表名: <Worksheet "Sheet2">

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')

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

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')

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

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方式(openpyxl,xlrd,xlwt,openpyxl,panda)

二、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文件

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

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文件

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

4、案例

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

把提供的原始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文件

python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)

5、总结

读取Excel时,选择openpyxl和xlrd差别不大,都能满足要求
写入少量数据且存为xls格式文件时,用xlwt更方便
写入大量数据(超过xls格式限制)或者必须存为xlsx格式文件时,就要用openpyxl了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章