https://blog.csdn.net/lm_love_hxl/article/details/130733070?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-1-130733070-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-1-130733070-null-null.nonecase
目录
2 Python xlwt 写入 操作Excel(仅限xls格式!)
3.3 xlutils 读取 写入 (也就是修改)Excel 表格信息
4 Python xlwings 读取 写入 修改 操作Excel
5 Python openpyxl 读取 写入 修改 操作Excel
7 Python win32com 读取 写入 修改 操作Excel
Python Excel库对比
我们先来看一下python中能操作Excel的库对比(一共九个库):
1 Python xlrd 读取 操作Excel
1.1 xlrd模块介绍
(1)什么是xlrd模块?
python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
(2)为什么使用xlrd模块?
在UI自动化或者接口自动化中数据维护是一个核心,所以此模块非常实用。
xlrd模块可以用于读取Excel的数据,速度非常快,推荐使用!
官方文档:https://xlrd.readthedocs.io/en/latest/
1.2 安装xlrd模块
到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。
或者在cmd窗口 pip install xlrd
pip install xlrd
我这里是anaconda自带有xlrd,所以提示已经安装:
1.3 使用介绍
1、常用单元格的数据类型
empty(空的)
string(text)
number
date
boolean
error
blank(空白表格)
2、导入模块
import xlrd
3、打开Excel文件读取数据
data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r
4、常用的函数
excel中最重要的方法就是book和sheet的操作
(1)获取book(excel文件)中一个工作表
-
table =
data.sheets()[0] #通过索引顺序获取
-
table =
data.sheet_by_index(sheet_indx) #通过索引顺序获取
-
table =
data.sheet_by_name(sheet_name) #通过名称获取
-
-
# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象
-
-
names =
data.sheet_names() #返回book中所有工作表的名字
-
data.sheet_loaded(sheet_name or indx) # 检查某个sheet是否导入完毕
(2) 行的操作
-
nrows
=
table.nrows
-
# 获取该sheet中的行数,注,这里
table.nrows后面不带().
-
table.row(rowx)
-
# 返回由该行中所有的单元格对象组成的列表,这与tabel.raw()方法并没有区别。
-
table.row_slice(rowx)
-
# 返回由该行中所有的单元格对象组成的列表
-
table.row_types(rowx,
start_colx
=
0,
end_colx
=None)
-
# 返回由该行中所有单元格的数据类型组成的列表;
-
# 返回值为逻辑值列表,若类型为empy则为
0,否则为
1
-
table.row_
values(rowx,
start_colx
=
0,
end_colx
=None)
-
# 返回由该行中所有单元格的数据组成的列表
-
table.row_len(rowx)
-
# 返回该行的有效单元格长度,即这一行有多少个数据
(3)列(colnum)的操作
-
ncols
=
table.ncols
-
# 获取列表的有效列数
-
table.
col(colx,
start_rowx
=
0,
end_rowx
=None)
-
# 返回由该列中所有的单元格对象组成的列表
-
table.
col_slice(colx,
start_rowx
=
0,
end_rowx
=None)
-
# 返回由该列中所有的单元格对象组成的列表
-
table.
col_types(colx,
start_rowx
=
0,
end_rowx
=None)
-
# 返回由该列中所有单元格的数据类型组成的列表
-
table.
col_
values(colx,
start_rowx
=
0,
end_rowx
=None)
-
# 返回由该列中所有单元格的数据组成的列表
(4)单元格的操作
-
table.cell(rowx,colx)
-
# 返回单元格对象
-
table.cell_
type(rowx,colx)
-
# 返回对应位置单元格中的数据类型
-
table.cell_
value(rowx,colx)
-
# 返回对应位置单元格中的数据
1.4 实战训练
我们先在表格放入以下数据,点击保存:
使用xlrd模块进行读取:
-
import xlrd
-
-
xlsx
= xlrd.
open_workbook(
'./3_1 xlrd 读取 操作练习.xlsx')
-
-
# 通过sheet名查找:xlsx.sheet_
by_name(
"sheet1")
-
# 通过索引查找:xlsx.sheet_
by_inde
x(3)
-
table
= xlsx.sheet_
by_inde
x(0)
-
-
# 获取单个表格值 (
2,1)表示获取第
3行第
2列单元格的值
-
value
=
table.cell_
value(
2,
1)
-
print(
"第3行2列值为",
value)
-
-
# 获取表格行数
-
nrows
=
table.nrows
-
print(
"表格一共有",nrows,
"行")
-
-
# 获取第
4列所有值(列表生成式)
-
name_list
= [str(
table.cell_
value(i,
3))
for i
in range(
1, nrows)]
-
print(
"第4列所有的值:",name_list)
打印结果:
列表生成式介绍:
列表生成式学习链接:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
2 Python xlwt 写入 操作Excel(仅限xls格式!)
xlwt可以用于写入新的Excel表格或者在原表格基础上进行修改,速度也很快,推荐使用!
官方文档:https://xlwt.readthedocs.io/en/latest/
2.1 pip安装xlwt
pip install xlwt
我这里是anaconda自带有xlwt,所以提示已经安装:
2.2 使用xlwt创建新表格并写入
一开始目录下只有这两个文件:
编写xlwt新表格写入程序:
-
#
3.2.2 使用xlwt创建新表格并写入
-
def fun
3_
2_
2():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
worksheet.
write(
2,1,
"内容2")
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
生成的表格内容如下:
2.3 xlwt 设置字体格式
程序示例:
-
#
3.2.3 xlwt设置字体格式
-
def fun
3_
2_
3():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 初始化样式
-
style
= xlwt.XFStyle()
-
-
# 为样式创建字体
-
font
= xlwt.Font()
-
font.name
=
'Times New Roman' #字体
-
font.bold
=
True #加粗
-
font.underline
=
True #下划线
-
font.italic
=
True #斜体
-
-
# 设置样式
-
style.font
= font
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
worksheet.
write(
2,1,
"内容2",style)
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
2.4 xlwt 设置列宽
xlwt中列宽的值表示方法:默认字体0的1/256为衡量单位。
xlwt创建时使用的默认宽度为2960,既11个字符0的宽度
所以我们在设置列宽时可以用如下方法:
width = 256 * 20 256为衡量单位,20表示20个字符宽度
程序示例:
-
#
3.2.4 设置列宽
-
def fun
3_
2_
4():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
worksheet.
write(
2,1,
"内容2")
-
-
# 设置列宽
-
worksheet.
col(
0).width
=
256
*
20
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
2.5 xlwt 设置行高
在xlwt中没有特定的函数来设置默认的列宽及行高
行高是在单元格的样式中设置的,你可以通过自动换行通过输入文字的多少来确定行高
程序示例:
-
#
3.2.5 设置行高
-
def fun
3_
2_
5():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
worksheet.
write(
2,1,
"内容2")
-
-
# 设置行高
-
style
= xlwt.easyxf(
'font:height 360;') #
18pt,类型小初的字号
-
row
= worksheet.row(
0)
-
row.
set_style(style)
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
2.6 xlwt 合并列和行
程序示例:
-
#
3.2.6 合并列和行
-
def fun
3_
2_
6():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
-
# 合并 第
1行到第
2行 的 第
0列到第
3列
-
worksheet.
write_
merge(
1,
2,
0,
3,
'Merge Test')
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
2.7 xlwt 添加边框
程序示例:
-
#
3.2.7 添加边框
-
def fun
3_
2_
7():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
-
# 设置边框样式
-
borders
= xlwt.Borders() # Create Borders
-
-
# May be:
NO_
LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR,
-
# MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED,
-
# MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED,
or
0x
00
through
0x
0D.
-
# DASHED虚线
-
#
NO_
LINE没有
-
# THIN实线
-
-
borders.
left
= xlwt.Borders.DASHED
-
borders.
right
= xlwt.Borders.DASHED
-
borders.
top
= xlwt.Borders.DASHED
-
borders.
bottom
= xlwt.Borders.DASHED
-
borders.
left_colour
=
0x
40
-
borders.
right_colour
=
0x
40
-
borders.
top_colour
=
0x
40
-
borders.
bottom_colour
=
0x
40
-
-
style
= xlwt.XFStyle() # Create Style
-
style.borders
= borders #
Add Borders
to Style
-
-
worksheet.
write(
0,
0,
'内容1', style)
-
-
worksheet.
write(
2,1,
"内容2")
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
2.8 xlwt为单元格设置背景色
程序示例:
-
# 设置单元格背景色
-
def fun
3_
2_
8():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
-
# 创建样式
-
pattern
= xlwt.Pattern()
-
-
# May be:
NO_PATTERN, SOLID_PATTERN,
or
0x
00
through
0x
12
-
pattern.pattern
= xlwt.Pattern.SOLID_PATTERN
-
-
# May be:
8
through
63.
0
= Black,
1
= White,
2
= Red,
3
= Green,
4
= Blue,
5
= Yellow,
-
#
6
= Magenta,
7
= Cyan,
16
= Maroon,
17
= Dark Green,
18
= Dark Blue,
19
= Dark Yellow ,
-
# almost brown),
20
= Dark Magenta,
21
= Teal,
22
= Light Gray,
23
= Dark Gray, the list goes
on...
-
pattern.pattern_fore_colour
=
5
-
style
= xlwt.XFStyle()
-
style.pattern
= pattern
-
-
# 使用样式
-
worksheet.
write(
2,1,
"内容2",style)
效果如下:
2.9 xlwt设置单元格对齐
使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式。
VERT_TOP = 0x00 上端对齐
VERT_CENTER = 0x01 居中对齐(垂直方向上)
VERT_BOTTOM = 0x02 低端对齐
HORZ_LEFT = 0x01 左端对齐
HORZ_CENTER = 0x02 居中对齐(水平方向上)
HORZ_RIGHT = 0x03 右端对齐
程序示例:
-
# 设置单元格对齐
-
def fun
3_
2_
9():
-
# 创建新的workbook(其实就是创建新的excel)
-
workbook
= xlwt.Workbook(encoding
=
'ascii')
-
-
# 创建新的sheet表
-
worksheet
= workbook.
add_sheet(
"My new Sheet")
-
-
# 往表格写入内容
-
worksheet.
write(
0,0,
"内容1")
-
-
# 设置样式
-
style
= xlwt.XFStyle()
-
al
= xlwt.Alignment()
-
# VERT_
TOP
=
0x
00 上端对齐
-
# VERT_CENTER
=
0x
01 居中对齐(垂直方向上)
-
# VERT_
BOTTOM
=
0x
02 低端对齐
-
# HORZ_
LEFT
=
0x
01 左端对齐
-
# HORZ_CENTER
=
0x
02 居中对齐(水平方向上)
-
# HORZ_
RIGHT
=
0x
03 右端对齐
-
al.horz
=
0x
02 # 设置水平居中
-
al.vert
=
0x
01 # 设置垂直居中
-
style.alignment
= al
-
-
# 对齐写入
-
worksheet.
write(
2,1,
"内容2",style)
-
-
# 保存
-
workbook.save(
"新创建的表格.xls")
效果如下:
3 Python xlutils 修改 操作Excel
xlutils可用于拷贝原excel或者在原excel基础上进行修改,并保存;
官方文档:https://xlutils.readthedocs.io/en/latest/
简说Python
3.1 pip安装xlutils
pip install xlutils
安装过程:
3.2 xlutils拷贝源文件(需配合xlrd使用)
表格内容如下:
程序示例:
-
#
3.3.2 拷贝源文件
-
def fun
3_
3_
2():
-
workbook
= xlrd.
open_workbook(
'3_3 xlutils 修改操作练习.xlsx') # 打开工作簿
-
new_workbook
=
copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
-
new_workbook.save(
"new_test.xls") # 保存工作簿
效果如下:
内容为:
不过表格的样式全部消失了。
3.3 xlutils 读取 写入 (也就是修改)Excel 表格信息
程序示例:
-
#
3.3.3 xlutils读取 写入 Excel 表格信息
-
def fun
3_
3_
3():
-
#
file_path:文件路径,包含文件的全名称
-
# formatting_info
=
True:保留Excel的原格式(使用与xlsx文件)
-
workbook
= xlrd.
open_workbook(
'3_3 xlutils 修改操作练习.xlsx')
-
-
new_workbook
=
copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
-
-
# 读取表格信息
-
sheet
= workbook.sheet_
by_inde
x(0)
-
col
2
= sheet.
col_
values(
1) # 取出第二列
-
cel_
value
= sheet.cell_
value(
1,
1)
-
print(
col
2)
-
print(cel_
value)
-
-
# 写入表格信息
-
write_save
= new_workbook.
get_sheet(
0)
-
write_save.
write(
0,
0,
"xlutils写入!")
-
-
new_workbook.save(
"new_test.xls") # 保存工作簿
效果如下:
复制了源文件信息,并进行了追加:
4 Python xlwings 读取 写入 修改 操作Excel
xlwings比起xlrd、xlwt和xlutils,xlwings可豪华多了,它具备以下特点:
xlwings能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改
可以和matplotlib以及pandas无缝连接,支持读写numpy、pandas数据类型,将matplotlib可视化图表导入到excel中。
可以调用Excel文件中VBA写好的程序,也可以让VBA调用用Python写的程序。
开源免费,一直在更新
官网地址:https://www.xlwings.org/
官方文档:https://docs.xlwings.org/en/stable/api.html
4.1 pip安装xlwings
pip install xlwings
4.2 基本操作
引入库
import xlwings as xw
打开Excel程序,默认设置:程序可见,只打开不新建工作薄
-
app
= xw.App(visible
=
True,
add_book
=
False)
-
#新建工作簿 (如果不接下一条代码的话,Excel只会一闪而过,卖个萌就走了)
-
wb
= app.books.
add()
打开已有工作簿(支持绝对路径和相对路径)
-
wb = app.books.
open(
'example.xlsx')
-
#练习的时候建议直接用下面这条
-
#wb = xw.Book('example.xlsx')
-
#这样的话就不会频繁打开新的Excel
保存工作簿
wb.save('example.xlsx')
退出工作簿(可省略)
wb.close()
退出Excel
app.quit()
三个例子:
(1)打开已存在的Excel文档
-
# 导入xlwings模块
-
import xlwings
as xw
-
-
# 打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
-
app=xw.App(visible=
True,add_book=
False)
-
app.display_alerts=
False
-
app.screen_updating=
False
-
-
# 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
-
filepath=
r'g:\Python Scripts\test.xlsx'
-
wb=app.books.
open(filepath)
-
wb.save()
-
wb.close()
-
app.quit()
(2)新建Excel文档,命名为test.xlsx,并保存在D盘
-
import xlwings
as xw
-
-
app=xw.App(visible=
True,add_book=
False)
-
wb=app.books.add()
-
wb.save(
r'd:\test.xlsx')
-
wb.close()
-
app.quit()
(3)在单元格输入值
新建test.xlsx,在sheet1的第一个单元格输入 “人生” ,然后保存关闭,退出Excel程序。
-
import xlwings
as xw
-
-
app=xw.App(visible=
True,add_book=
False)
-
wb=app.books.add()
-
-
# wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
-
wb.sheets[
'sheet1'].
range(
'A1').value=
'人生'
-
wb.save(
r'd:\test.xlsx')
-
wb.close()
-
app.quit()
打开已保存的test.xlsx,在sheet2的第二个单元格输入“苦短”,然后保存关闭,退出Excel程序
-
import xlwings
as xw
-
-
app=xw.App(visible=
True,add_book=
False)
-
wb=app.books.
open(
r'd:\test.xlsx')
-
-
# wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
-
wb.sheets[
'sheet1'].
range(
'A1').value=
'苦短'
-
wb.save()
-
wb.close()
-
app.quit()
掌握以上代码,已经完全可以把Excel当作一个txt文本进行数据储存了,也可以读取Excel文件的数据,进行计算后,并将结果保存在Excel中。
4.3 引用工作薄、工作表和单元格
(1)按名字引用工作簿,注意工作簿应该首先被打开
wb=xw.books['工作簿的名字‘]
(2)引用活动的工作薄
wb=xw.books.active
(3)引用工作簿中的sheet
-
sht
=xw.books[
'工作簿的名字‘].sheets['sheet的名字
']
-
# 或者
-
wb=xw.books['工作簿的名字
']
-
sht=wb.sheets[sheet的名字]
-
(4)引用活动sheet
sht=xw.sheets.active
(5)引用A1单元格
-
rng
=xw.books[
'工作簿的名字‘].sheets['sheet的名字
']
-
# 或者
-
sht=xw.books['工作簿的名字‘].sheets[
'sheet的名字']
-
rng
=sht.range(
'A1')
(6)引用活动sheet上的单元格
-
# 注意Range首字母大写
-
rng
=xw.Range(
'A1')
-
-
#其中需要注意的是单元格的完全引用路径是:
-
# 第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
-
xw.apps[
0].books[
0].sheets[
0].range(
'A1')
-
迅速引用单元格的方式是
-
sht
=xw.books[
'名字'].sheets[
'名字']
-
-
# A
1单元格
-
rng
=sht[’A
1
']
-
-
# A1:B5单元格
-
rng=sht['A
1:B
5
']
-
-
# 在第i+1行,第j+1列的单元格
-
# B1单元格
-
rng=sht[0,1]
-
-
# A1:J10
-
rng=sht[:10,:10]
-
-
#PS: 对于单元格也可以用表示行列的tuple进行引用
-
# A1单元格的引用
-
xw.Range(1,1)
-
-
#A1:C3单元格的引用
-
xw.Range((1,1),(3,3))
-
引用单元格:
-
rng
= sht.range(
'a1')
-
#rng
= sht[
'a1']
-
#rng
= sht[
0,0] 第一行的第一列即a
1,相当于pandas的切片
引用区域:
-
rng
= sht.range(
'a1:a5')
-
#rng
= sht[
'a1:a5']
-
#rng
= sht[:
5,0]
4.4 写入&读取数据
1.写入数据
(1)选择起始单元格A1,写入字符串‘Hello’
sht.range('a1').value = 'Hello'
(2)写入列表
-
# 行存储:将列表[
1,2,3]储存在A
1:C
1中
-
sht.range(
'A1').
value
=[
1,2,3]
-
# 列存储:将列表[
1,2,3]储存在A
1:A
3中
-
sht.range(
'A1').
options(transpose
=
True).
value
=[
1,2,3]
-
# 将
2x
2表格,即二维数组,储存在A
1:B
2中,如第一行
1,
2,第二行
3,
4
-
sht.range(
'A1').
options(expand
=
'table')
=[[
1,2],[
3,4]]
默认按行插入:A1:D1分别写入1,2,3,4
sht.range('a1').value = [1,2,3,4]
等同于
sht.range('a1:d1').value = [1,2,3,4]
按列插入:A2:A5分别写入5,6,7,8
你可能会想:
sht.range('a2:a5').value = [5,6,7,8]
但是你会发现xlwings还是会按行处理的,上面一行等同于:
sht.range('a2').value = [5,6,7,8]
正确语法:
sht.range('a2').options(transpose=True).value = [5,6,7,8]
既然默认的是按行写入,我们就把它倒过来嘛(transpose),单词要打对,如果你打错单词,它不会报错,而会按默认的行来写入(别问我怎么知道的)
多行输入就要用二维列表了:
sht.range('a6').expand('table').value = [['a','b','c'],['d','e','f'],['g','h','i']]
2.读取数据
(1)读取单个值
-
# 将A1的值,读取到a变量中
-
a=sht.
range(
'A1').value
(2)将值读取到列表中
-
#将A1到A2的值,读取到a列表中
-
a=sht.
range(
'A1:A2').value
-
# 将第一行和第二行的数据按二维数组的方式读取
-
a=sht.
range(
'A1:B2').value
选取一列的数据
先计算单元格的行数(前提是连续的单元格)
-
rng
= sht.range(
'a1').expand(
'table')
-
nrows
= rng.rows.
count
接着就可以按准确范围读取了
a = sht.range(f'a1:a{nrows}').value
选取一行的数据
-
ncols
= rng.
columns.
count
-
#用切片
-
fst_
col
= sht[
0,:ncols].
value
4.5 常用函数和方法
1.Book工作薄常用的api
wb=xw.books[‘工作簿名称']
-
wb
.activate() 激活为当前工作簿
-
wb
.fullname 返回工作簿的绝对路径
-
wb
.name 返回工作簿的名称
-
wb
.save(path=None) 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
-
wb.
close() 关闭工作簿
代码示例:
-
# 引用Excel程序中,当前的工作簿
-
wb
=xw.books.acitve
-
# 返回工作簿的绝对路径
-
x
=wb.fullname
-
# 返回工作簿的名称
-
x
=wb.name
-
# 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
-
x
=wb.save(path
=None)
-
# 关闭工作簿
-
x
=wb.
close()
2.sheet常用的api
-
# 引用某指定sheet
-
sht=xw.books[
'工作簿名称'].sheets[
'sheet的名称']
-
# 激活sheet为活动工作表
-
sht.activate()
-
# 清除sheet的内容和格式
-
sht.clear()
-
# 清除sheet的内容
-
sht.contents()
-
# 获取sheet的名称
-
sht.name
-
# 删除sheet
-
sht.
delete
3.range常用的api
-
# 引用当前活动工作表的单元格
-
rng=xw.Range(
'A1')
-
# 加入超链接
-
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:点击即链接到百度')
-
# 取得当前range的地址
-
rng.address
-
rng.get_address()
-
# 清除range的内容
-
rng.clear_contents()
-
# 清除格式和内容
-
rng.clear()
-
# 取得range的背景色,以元组形式返回RGB值
-
rng.color
-
# 设置range的颜色
-
rng.color=(
255,
255,
255)
-
# 清除range的背景色
-
rng.color=
None
-
# 获得range的第一列列标
-
rng.column
-
# 返回range中单元格的数据
-
rng.count
-
# 返回current_region
-
rng.current_region
-
# 返回ctrl + 方向
-
rng.end(
'down')
-
# 获取公式或者输入公式
-
rng.formula=
'=SUM(B1:B5)'
-
# 数组公式
-
rng.formula_array
-
# 获得单元格的绝对地址
-
rng.get_address(row_absolute=
True, column_absolute=
True,include_sheetname=
False, external=
False)
-
# 获得列宽
-
rng.column_width
-
# 返回range的总宽度
-
rng.width
-
# 获得range的超链接
-
rng.hyperlink
-
# 获得range中右下角最后一个单元格
-
rng.last_cell
-
# range平移
-
rng.offset(row_offset=
0,column_offset=
0)
-
#range进行resize改变range的大小
-
rng.resize(row_size=
None,column_size=
None)
-
# range的第一行行标
-
rng.row
-
# 行的高度,所有行一样高返回行高,不一样返回None
-
rng.row_height
-
# 返回range的总高度
-
rng.height
-
# 返回range的行数和列数
-
rng.shape
-
# 返回range所在的sheet
-
rng.sheet
-
#返回range的所有行
-
rng.rows
-
# range的第一行
-
rng.rows[
0]
-
# range的总行数
-
rng.rows.count
-
# 返回range的所有列
-
rng.columns
-
# 返回range的第一列
-
rng.columns[
0]
-
# 返回range的列数
-
rng.columns.count
-
# 所有range的大小自适应
-
rng.autofit()
-
# 所有列宽度自适应
-
rng.columns.autofit()
-
# 所有行宽度自适应
-
rng.rows.autofit()
4.books 工作簿集合的api
-
# 新建工作簿
-
xw.books.
add()
-
# 引用当前活动工作簿
-
xw.books.active
5.sheets 工作表的集合
-
# 新建工作表
-
xw.sheets.
add(name
=None,
before
=None,
after
=None)
-
# 引用当前活动sheet
-
xw.sheets.active
4.6 数据结构
1.一维数据
python的列表,可以和Excel中的行列进行数据交换,python中的一维列表,在Excel中默认为一行数据。
-
import xlwings
as xw
-
-
sht
=xw.sheets.active
-
-
# 将
1,
2,
3分别写入了A
1,B
1,C
1单元格中
-
sht.range(
'A1').
value
=[
1,2,3]
-
-
# 将A
1,B
1,C
1单元格的值存入list
1列表中
-
list
1
=sht.range(
'A1:C1').
value
-
-
# 将
1,
2,
3分别写入了A
1,A
2,A
3单元格中
-
sht.range(
'A1').
options(transpose
=
True).
value
=[
1,2,3]
-
-
# 将A
1,A
2,A
3单元格中值存入list
1列表中
-
list
1
=sht.range(
'A1:A3').
value
2.二维数据
python的二维列表,可以转换为Excel中的行列。二维列表,即列表中的元素还是列表。在Excel中,二维列表中的列表元素,代表Excel表格中的一列。例如:
-
# 将a
1,a
2,a
3输入第一列,b
1,b
2,b
3输入第二列
-
list
1
=[[‘a
1’,
'a2',
'a3'],[
'b1',
'b2',
'b3']]
-
sht.range(
'A1').
value
=list
1
-
# 将A
1:B
3的值赋给二维列表list
1
-
list
1
=sht.range(
'A1:B3').
value
3.Excel中区域的选取表格
-
# 选取第一列
-
rng=sht. range(
'A1').
expand(
'down')
-
rng.value=[
'a1',
'a2',
'a3']
-
# 选取第一行
-
rng=sht.range(
'A1').
expand(
'right')
-
rng=[
'a1',
'b1']
-
# 选取表格
-
rng.sht.range(
'A1').
expand(
'table')
-
rng.value=[[‘a1’,
'a2',
'a3'],[
'b1',
'b2',
'b3']]
4.7 xlwings生成图表
生成图表的方法
-
import xlwings
as xw
-
app
= xw.App()
-
wb
= app.books.active
-
sht
= wb.sheets.active
-
-
chart
= sht.charts.
add(
100,
10) #
100,
10 为图表放置的位置坐标。以像素为单位。
-
chart.
set_
source_
data(sht.range(
'A1').expand()) # 参数为表格中的数据区域。
-
# chart.chart_
type
= i # 用来设置图表类型,具体参数件下面详细说明。
-
chart.api[
1].ChartTitle.Text
= i # 用来设置图表的标题。
示例代码:
-
import xlwings
as xw
-
app
= xw.App()
-
wb
= app.books.active
-
sht
= wb.sheets.active
-
# 生成图表的数据
-
sht.range(
'A1').
value
= [[
'时间',
'数量'], [
'1日',
2], [
'2日',
1], [
'3日',
3]
-
, [
'4日',
4], [
'5日',
5], [
'6日',
6]]
-
""
"图表类型参数,被注释的那几个,无法生成对应的图表"
""
-
dic
= {
-
'3d_area': -
4098,
-
'3d_area_stacked':
78,
-
'3d_area_stacked_100':
79,
-
'3d_bar_clustered':
60,
-
'3d_bar_stacked':
61,
-
'3d_bar_stacked_100':
62,
-
'3d_column': -
4100,
-
'3d_column_clustered':
54,
-
'3d_column_stacked':
55,
-
'3d_column_stacked_100':
56,
-
'3d_line': -
4101,
-
'3d_pie': -
4102,
-
'3d_pie_exploded':
70,
-
'area':
1,
-
'area_stacked':
76,
-
'area_stacked_100':
77,
-
'bar_clustered':
57,
-
'bar_of_pie':
71,
-
'bar_stacked':
58,
-
'bar_stacked_100':
59,
-
'bubble':
15,
-
'bubble_3d_effect':
87,
-
'column_clustered':
51,
-
'column_stacked':
52,
-
'column_stacked_100':
53,
-
'cone_bar_clustered':
102,
-
'cone_bar_stacked':
103,
-
'cone_bar_stacked_100':
104,
-
'cone_col':
105,
-
'cone_col_clustered':
99,
-
'cone_col_stacked':
100,
-
'cone_col_stacked_100':
101,
-
'cylinder_bar_clustered':
95,
-
'cylinder_bar_stacked':
96,
-
'cylinder_bar_stacked_100':
97,
-
'cylinder_col':
98,
-
'cylinder_col_clustered':
92,
-
'cylinder_col_stacked':
93,
-
'cylinder_col_stacked_100':
94,
-
'doughnut': -
4120,
-
'doughnut_exploded':
80,
-
'line':
4,
-
'line_markers':
65,
-
'line_markers_stacked':
66,
-
'line_markers_stacked_100':
67,
-
'line_stacked':
63,
-
'line_stacked_100':
64,
-
'pie':
5,
-
'pie_exploded':
69,
-
'pie_of_pie':
68,
-
'pyramid_bar_clustered':
109,
-
'pyramid_bar_stacked':
110,
-
'pyramid_bar_stacked_100':
111,
-
'pyramid_col':
112,
-
'pyramid_col_clustered':
106,
-
'pyramid_col_stacked':
107,
-
'pyramid_col_stacked_100':
108,
-
'radar': -
4151,
-
'radar_filled':
82,
-
'radar_markers':
81,
-
#
'stock_hlc':
88,
-
#
'stock_ohlc':
89,
-
#
'stock_vhlc':
90,
-
#
'stock_vohlc':
91,
-
#
'surface':
83,
-
#
'surface_top_view':
85,
-
#
'surface_top_view_wireframe':
86,
-
#
'surface_wireframe':
84,
-
'xy_scatter': -
4169,
-
'xy_scatter_lines':
74,
-
'xy_scatter_lines_no_markers':
75,
-
'xy_scatter_smooth':
72,
-
'xy_scatter_smooth_no_markers':
73
-
}
-
w
=
385
-
h
=
241
-
n
=
0
-
x
=
100
-
y
=
10
-
for i
in dic.keys():
-
xx
= x
+ n %
3
*w # 用来生成图表放置的x坐标。
-
yy
= y
+ n
/
/
3
*h # 用来生成图表放置的y坐标。
-
chart
= sht.charts.
add(xx, yy)
-
chart.
set_
source_
data(sht.range(
'A1').expand())
-
chart.chart_
type
= i
-
chart.api[
1].ChartTitle.Text
= i
-
n
+
=
1
-
wb.save(
'chart_图表')
-
wb.
close()
-
app.quit()
效果如下:
4.8 实战训练
- xlwings 新建 Excel 文档
程序示例:
-
# 3.4.2 xlwings 新建 Excle 文档
-
def
fun3_4_2():
-
"""
-
visible
-
Ture:可见excel
-
False:不可见excel
-
add_book
-
True:打开excel并且新建工作簿
-
False:不新建工作簿
-
"""
-
app = xw.App(visible=
True, add_book=
False)
-
-
# 新建工作簿 (如果不接下一条代码的话,Excel只会一闪而过,卖个萌就走了)
-
wb = app.books.add()
-
-
# 保存工作簿
-
wb.save(
'example.xlsx')
-
-
# 退出工作簿
-
wb.close()
-
-
# 退出Excel
-
app.quit()
执行程序后文件夹增加了“example.xlsx”:
此时表格是空的:
2. xlwings 打开已存在的 Excel 文档
现有表格长这样:
运行程序:
-
#
3.4.3 xlwings 打开已存在的Excel文件
-
def fun
3_
4_
3():
-
# 新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
-
app
= xw.App(visible
=
True,
add_book
=
False)
-
app.
display_alerts
=
False
-
app.
screen_updating
=
False
-
-
# 打开已存在的Excel文件
-
wb
=app.books.
open(
'./3_4 xlwings 修改操作练习.xlsx')
-
-
# 保存工作簿
-
wb.save(
'example_2.xlsx')
-
-
# 退出工作簿
-
wb.
close()
-
-
# 退出Excel
-
app.quit()
生成新的表格:
内容如下:
3. xlwings 读写 Excel
程序示例:
-
#
3.4.4 xlwings读写 Excel
-
def fun
3_
4_
4():
-
# 新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
-
app
= xw.App(visible
=
True,
add_book
=
False)
-
app.
display_alerts
=
False
-
app.
screen_updating
=
False
-
-
# 打开已存在的Excel文件
-
wb
=app.books.
open(
'./3_4 xlwings 修改操作练习.xlsx')
-
-
# 获取sheet对象
-
print(wb.sheets)
-
sheet
= wb.sheets[
0]
-
# sheet
= wb.sheets[
"sheet1"]
-
-
# 读取Excel信息
-
cellB
1_
value
= sheet.range(
'B1').
value
-
print(
"单元格B1内容为:",cellB
1_
value)
-
-
# 清除单元格内容和格式
-
sheet.range(
'A1').clear()
-
-
# 写入单元格
-
sheet.range(
'A1').
value
=
"xlwings写入"
-
-
# 保存工作簿
-
wb.save(
'example_3.xlsx')
-
-
# 退出工作簿
-
wb.
close()
-
-
# 退出Excel
-
app.quit()
执行效果:
4.9 更多请参考
xlwings官方文档
插上翅膀,让Excel飞起来——xlwings(一)
插上翅膀,让Excel飞起来——xlwings(二)
插上翅膀,让Excel飞起来——xlwings(三)
插上翅膀,让Excel飞起来——xlwings(四)
Python与Excel交互——Xlwings
5 Python openpyxl 读取 写入 修改 操作Excel
在openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells。
Workbook就是一个excel工作表;
Sheet是工作表中的一张表页;
Cell就是简单的一个格。
openpyxl就是围绕着这三个概念进行的,不管读写都是“三板斧”:打开Workbook,定位Sheet,操作Cell。
官方文档:https://openpyxl.readthedocs.io/en/stable/
官方示例:
-
from openpyxl import Workbook
-
wb
= Workbook()
-
-
# grab the active worksheet
-
ws
= wb.active
-
-
#
Data can be assigned directly
to cells
-
ws[
'A1']
=
42
-
-
# Rows can
also be appended
-
ws.append([
1,
2,
3])
-
-
# Python types will automatically be converted
-
import datetime
-
ws[
'A2']
= datetime.datetime.now()
-
-
# Save the
file
-
wb.save(
"sample.xlsx")
5.1 openpyxl 基本操作
1.安装
pip install openpyxl
因为我已经安装,所以提示如下信息:
2.打开文件
(1)新建
-
from openpyxl
import Workbook
-
# 实例化
-
wb =
Workbook()
-
# 激活 worksheet
-
ws = wb.active
(2)打开已有
-
from openpyxl
import load_workbook
-
-
wb =
load_workbook(
'文件名称.xlsx')
3.写入数据
-
# 方式一:数据可以直接分配到单元格中(可以输入公式)
-
ws[
'A1'] =
42
-
# 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
-
ws.append([
1,
2,
3])
-
# 方式三:Python 类型会被自动转换
-
ws[
'A3'] = datetime.datetime.now().strftime(
"%Y-%m-%d")
4.创建表(sheet)
-
# 方式一:插入到最后(
default)
-
ws
1
= wb.create_sheet(
"Mysheet")
-
# 方式二:插入到最开始的位置
-
ws
2
= wb.create_sheet(
"Mysheet",
0)
5.选择表(sheet)
-
# sheet 名称可以作为 key 进行索引
-
>>> ws3 = wb[
"New Title"]
-
>>> ws4 = wb.get_sheet_by_name(
"New Title")
-
>>> ws
is ws3
is ws4
-
True
6.查看表名(sheet)
-
# 显示所有表名
-
>>>
print(wb.sheetnames)
-
[
'Sheet2',
'New Title',
'Sheet1']
-
# 遍历所有表
-
>>>
for sheet
in wb:
-
...
print(sheet.title)
7.访问单元格(cell)
(1)单个单元格访问
-
# 方法一
-
>>> c = ws[
'A4']
-
# 方法二:row 行;column 列
-
>>> d = ws.cell(row=
4, column=
2, value=
10)
-
# 方法三:只要访问就创建
-
>>>
for i
in
range(
1,
101):
-
...
for j
in
range(
1,
101):
-
... ws.cell(row=i, column=j)
(2)多个单元格访问
-
# 通过切片
-
>>> cell_range = ws['A1':'C2']
-
# 通过行(列)
-
>>> colC = ws['C']
-
>>> col_range = ws['C:D']
-
>>> row10 = ws[10]
-
>>> row_range = ws[5:10]
-
# 通过指定范围(行 → 行)
-
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
-
...
for cell
in row:
-
... print(cell)
-
<Cell Sheet
1.A
1
>
-
<Cell Sheet
1.B
1
>
-
<Cell Sheet
1.C
1
>
-
<Cell Sheet
1.A
2
>
-
<Cell Sheet
1.B
2
>
-
<Cell Sheet
1.C
2
>
-
# 通过指定范围(列 → 列)
-
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
-
...
for cell
in row:
-
... print(cell)
-
<Cell Sheet
1.A
1
>
-
<Cell Sheet
1.B
1
>
-
<Cell Sheet
1.C
1
>
-
<Cell Sheet
1.A
2
>
-
<Cell Sheet
1.B
2
>
-
<Cell Sheet
1.C
2
>
-
# 遍历所有 方法一
-
>>> ws = wb.active
-
>>> ws['C9'] = 'hello world'
-
>>> tuple(ws.rows)
-
((
<Cell Sheet.A
1
>,
<Cell Sheet.B
1
>,
<Cell Sheet.C
1
>),
-
(
<Cell Sheet.A
2
>,
<Cell Sheet.B
2
>,
<Cell Sheet.C
2
>),
-
...
-
(
<Cell Sheet.A
8
>,
<Cell Sheet.B
8
>,
<Cell Sheet.C
8
>),
-
(
<Cell Sheet.A
9
>,
<Cell Sheet.B
9
>,
<Cell Sheet.C
9
>))
-
# 遍历所有 方法二
-
>>> tuple(ws.columns)
-
((
<Cell Sheet.A
1
>,
-
<Cell Sheet.A
2
>,
-
<Cell Sheet.A
3
>,
-
...
-
<Cell Sheet.B
7
>,
-
<Cell Sheet.B
8
>,
-
<Cell Sheet.B
9
>),
-
(
<Cell Sheet.C
1
>,
-
...
-
<Cell Sheet.C
8
>,
-
<Cell Sheet.C
9
>))
8.保存数据
wb.save('文件名称.xlsx')
9.其它
(1)改变sheet标签按钮颜色
ws.sheet_properties.tabColor = "1072BA" # 色值为RGB16进制值
(2)获取最大行,最大列
-
# 获得最大列和最大行
-
print(sheet.max_row)
-
print(sheet.max_column)
(3)获取每一行每一列
sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
sheet.columns类似,不过里面是每个tuple是每一列的单元格。
-
# 因为按行,所以返回A
1, B
1, C
1这样的顺序
-
for row
in sheet.rows:
-
for cell
in row:
-
print(cell.
value)
-
-
# A
1, A
2, A
3这样的顺序
-
for
column
in sheet.
columns:
-
for cell
in
column:
-
print(cell.
value)
(4)根据数字得到字母,根据字母得到数字
-
from openpyxl.utils import
get_
column_letter,
column_
index_
from_
string
-
-
# 根据列的数字返回字母
-
print(
get_
column_letter(
2)) # B
-
# 根据字母返回列的数字
-
print(
column_
index_
from_
string(
'D')) #
4
(5)删除工作表
-
# 方式一
-
wb.
remove(sheet)
-
# 方式二
-
del wb[sheet]
(6)矩阵置换
-
rows
= [
-
[
'Number',
'data1',
'data2'],
-