Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!

python学习网 2020-08-25 09:20:13

文章目录

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771

 

修订历史

更新日期 版本号 备注 修改者
2020.8.15 v1.0 新建,包含7个库的实战操作 tangxing07
2020.8.20 v2.0 新增各个库基本操作,增加图表操作 tangxing07

0.Python Excel库对比
1.Python xlrd 读取 操作Excel
2.Python xlwt 写入 操作Excel
3.Python xlutils 修改 操作Excel
4.Python xlwings 读取 写入 修改 操作Excel
5.Python openpyxl 读取 写入 修改 操作Excel
6.Python xlswriter 写入 操作Excel
7.Python win32com 读取 写入 修改 操作Excel
8.Python pandas 读取 写入 操作Excel

0.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
  • 1

我这里是anaconda自带有xlrd,所以提示已经安装:

image-20200615090402808

1.3 使用介绍

  1. 常用单元格的数据类型
  • empty(空的)
  • string(text)
  • number
  • date
  • boolean
  • error
  • blank(空白表格)
  1. 导入模块
import xlrd
  • 1
  1. 打开Excel文件读取数据
data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r
  • 1
  1. 常用的函数
  • 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是否导入完毕
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(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)
    # 返回该行的有效单元格长度,即这一行有多少个数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

image-20200820092915561

(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)
    # 返回由该列中所有单元格的数据组成的列表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

image-20200820093110184

(4)单元格的操作

table.cell(rowx,colx)
    # 返回单元格对象

table.cell_type(rowx,colx)
    # 返回对应位置单元格中的数据类型

table.cell_value(rowx,colx)
    # 返回对应位置单元格中的数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1.4 实战训练

我们先在表格放入以下数据,点击保存:

image-20200615084940783

使用xlrd模块进行读取:

import xlrd

xlsx = xlrd.open_workbook('./3_1 xlrd 读取 操作练习.xlsx')

# 通过sheet名查找:xlsx.sheet_by_name("sheet1")
# 通过索引查找:xlsx.sheet_by_index(3)
table = xlsx.sheet_by_index(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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

打印结果:

image-20200615085732936

列表生成式介绍:

image-20200820094507777

列表生成式学习链接:

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
  • 1

我这里是anaconda自带有xlwt,所以提示已经安装:

image-20200615090449740

2.2 使用xlwt创建新表格并写入

一开始目录下只有这两个文件:

image-20200615100134069

编写xlwt新表格写入程序:

# 3.2.2 使用xlwt创建新表格并写入
def fun3_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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

image-20200615102340112

生成的表格内容如下:

image-20200615100118333

2.3 xlwt 设置字体格式

程序示例:

# 3.2.3 xlwt设置字体格式
def fun3_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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

效果如下:

image-20200615102507547

2.4 xlwt 设置列宽

xlwt中列宽的值表示方法:默认字体0的1/256为衡量单位。

xlwt创建时使用的默认宽度为2960,既11个字符0的宽度

所以我们在设置列宽时可以用如下方法:

width = 256 * 20 256为衡量单位,20表示20个字符宽度

程序示例:

# 3.2.4 设置列宽
def fun3_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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

效果如下:

image-20200615103605984

2.5 xlwt 设置行高

在xlwt中没有特定的函数来设置默认的列宽及行高

行高是在单元格的样式中设置的,你可以通过自动换行通过输入文字的多少来确定行高

程序示例:

# 3.2.5 设置行高
def fun3_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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

效果如下:

image-20200615104151510

2.6 xlwt 合并列和行

程序示例:

# 3.2.6 合并列和行
def fun3_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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

效果如下:

image-20200615104812867

2.7 xlwt 添加边框

程序示例:

# 3.2.7 添加边框
def fun3_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 0x00 through 0x0D.
    # 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 = 0x40
    borders.right_colour = 0x40
    borders.top_colour = 0x40
    borders.bottom_colour = 0x40
    
    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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

效果如下:

image-20200615110758086

2.8 xlwt为单元格设置背景色

程序示例:

# 设置单元格背景色
def fun3_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 0x00 through 0x12
    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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

效果如下:

image-20200615111110341

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 fun3_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 = 0x00       上端对齐
    # VERT_CENTER = 0x01    居中对齐(垂直方向上)
    # VERT_BOTTOM = 0x02    低端对齐
    # HORZ_LEFT = 0x01      左端对齐
    # HORZ_CENTER = 0x02    居中对齐(水平方向上)
    # HORZ_RIGHT = 0x03     右端对齐
    al.horz = 0x02  # 设置水平居中
    al.vert = 0x01  # 设置垂直居中
    style.alignment = al

    # 对齐写入
    worksheet.write(2,1, "内容2",style)

    # 保存
    workbook.save("新创建的表格.xls")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

效果如下:

image-20200615111623987

3 Python xlutils 修改 操作Excel

xlutils可用于拷贝原excel或者在原excel基础上进行修改,并保存;

官方文档:https://xlutils.readthedocs.io/en/latest/

3.1 pip安装xlutils

pip install xlutils
  • 1

安装过程:

image-20200615121855654

3.2 xlutils拷贝源文件(需配合xlrd使用)

image-20200615122429075

表格内容如下:

image-20200615122240232

程序示例:

# 3.3.2 拷贝源文件
def fun3_3_2():
    workbook = xlrd.open_workbook('3_3 xlutils 修改操作练习.xlsx')  # 打开工作簿
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_workbook.save("new_test.xls")  # 保存工作簿
  • 1
  • 2
  • 3
  • 4
  • 5

效果如下:

image-20200615123149622

内容为:

image-20200615123031329

不过表格的样式全部消失了。

3.3 xlutils 读取 写入 (也就是修改)Excel 表格信息

程序示例:

# 3.3.3 xlutils读取 写入 Excel 表格信息
def fun3_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_index(0)
    col2 = sheet.col_values(1)  # 取出第二列
    cel_value = sheet.cell_value(1, 1)
    print(col2)
    print(cel_value)

    # 写入表格信息
    write_save = new_workbook.get_sheet(0)
    write_save.write(0, 0, "xlutils写入!")

    new_workbook.save("new_test.xls")  # 保存工作簿
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

效果如下:

image-20200615130041556

复制了源文件信息,并进行了追加:

image-20200615125319471

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

image-20200615140316605

img

4.1 pip安装xlwings

pip install xlwings
  • 1

4.2 基本操作

引入库

import xlwings as xw 
  • 1

打开Excel程序,默认设置:程序可见,只打开不新建工作薄

app = xw.App(visible=True,add_book=False)
#新建工作簿 (如果不接下一条代码的话,Excel只会一闪而过,卖个萌就走了)
wb = app.books.add()
  • 1
  • 2
  • 3

打开已有工作簿(支持绝对路径和相对路径)

wb = app.books.open('example.xlsx')
#练习的时候建议直接用下面这条
#wb = xw.Book('example.xlsx')
#这样的话就不会频繁打开新的Excel
  • 1
  • 2
  • 3
  • 4

保存工作簿

wb.save('example.xlsx')
  • 1

退出工作簿(可省略)

wb.close()
  • 1

退出Excel

app.quit()
  • 1

三个例子:

(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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

(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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打开已保存的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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

掌握以上代码,已经完全可以把Excel当作一个txt文本进行数据储存了,也可以读取Excel文件的数据,进行计算后,并将结果保存在Excel中。

4.3 引用工作薄、工作表和单元格

(1)按名字引用工作簿,注意工作簿应该首先被打开

wb=xw.books['工作簿的名字‘]
  • 1

(2)引用活动的工作薄

wb=xw.books.active
  • 1

(3)引用工作簿中的sheet

sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字]
  • 1
  • 2
  • 3
  • 4

(4)引用活动sheet

sht=xw.sheets.active
  • 1

(5)引用A1单元格

rng=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1')
  • 1
  • 2
  • 3
  • 4

(6)引用活动sheet上的单元格

# 注意Range首字母大写
rng=xw.Range('A1')

#其中需要注意的是单元格的完全引用路径是:
# 第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
xw.apps[0].books[0].sheets[0].range('A1')
迅速引用单元格的方式是
sht=xw.books['名字'].sheets['名字']

# A1单元格
rng=sht[’A1']
        
# A1:B5单元格
rng=sht['A1:B5']
        
# 在第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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

引用单元格:

rng = sht.range('a1')
#rng = sht['a1']
#rng = sht[0,0] 第一行的第一列即a1,相当于pandas的切片
  • 1
  • 2
  • 3

引用区域:

rng = sht.range('a1:a5')
#rng = sht['a1:a5']
#rng = sht[:5,0]
  • 1
  • 2
  • 3

4.4 写入&读取数据

1.写入数据

(1)选择起始单元格A1,写入字符串‘Hello’

sht.range('a1').value = 'Hello'
  • 1

(2)写入列表

# 行存储:将列表[1,2,3]储存在A1:C1中
sht.range('A1').value=[1,2,3]
# 列存储:将列表[1,2,3]储存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
# 将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table')=[[1,2],[3,4]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 默认按行插入:A1:D1分别写入1,2,3,4
sht.range('a1').value = [1,2,3,4]
  • 1

等同于

sht.range('a1:d1').value = [1,2,3,4]
  • 1
  • 按列插入: A2:A5分别写入5,6,7,8

你可能会想:

sht.range('a2:a5').value = [5,6,7,8]
  • 1

但是你会发现xlwings还是会按行处理的,上面一行等同于:

sht.range('a2').value = [5,6,7,8]
  • 1

正确语法:

sht.range('a2').options(transpose=True).value = [5,6,7,8]
  • 1

既然默认的是按行写入,我们就把它倒过来嘛(transpose),单词要打对,如果你打错单词,它不会报错,而会按默认的行来写入(别问我怎么知道的)

  • 多行输入就要用二维列表了:
sht.range('a6').expand('table').value = [['a','b','c'],['d','e','f'],['g','h','i']]
  • 1

2.读取数据

(1)读取单个值

# 将A1的值,读取到a变量中
a=sht.range('A1').value
  • 1
  • 2

(2)将值读取到列表中

#将A1到A2的值,读取到a列表中
a=sht.range('A1:A2').value
# 将第一行和第二行的数据按二维数组的方式读取
a=sht.range('A1:B2').value
  • 1
  • 2
  • 3
  • 4
  • 选取一列的数据

先计算单元格的行数(前提是连续的单元格)

rng = sht.range('a1').expand('table')
nrows = rng.rows.count
  • 1
  • 2

接着就可以按准确范围读取了

a = sht.range(f'a1:a{nrows}').value
  • 1
  • 选取一行的数据
ncols = rng.columns.count
#用切片
fst_col = sht[0,:ncols].value
  • 1
  • 2
  • 3

4.5 常用函数和方法

1.Book工作薄常用的api

wb=xw.books[‘工作簿名称']
  • 1
  • 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.sheet常用的api

# 引用某指定sheet
sht=xw.books['工作簿名称'].sheets['sheet的名称']
# 激活sheet为活动工作表
sht.activate()
# 清除sheet的内容和格式
sht.clear()
# 清除sheet的内容
sht.contents()
# 获取sheet的名称
sht.name
# 删除sheet
sht.delete
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

4.books 工作簿集合的api

# 新建工作簿
xw.books.add()
# 引用当前活动工作簿
xw.books.active
  • 1
  • 2
  • 3
  • 4

4.sheets 工作表的集合

# 新建工作表
xw.sheets.add(name=None,before=None,after=None)
# 引用当前活动sheet
xw.sheets.active
  • 1
  • 2
  • 3
  • 4

4.6 数据结构

1.一维数据

python的列表,可以和Excel中的行列进行数据交换,python中的一维列表,在Excel中默认为一行数据。

import xlwings as xw

sht=xw.sheets.active

# 将1,2,3分别写入了A1,B1,C1单元格中
sht.range('A1').value=[1,2,3]

# 将A1,B1,C1单元格的值存入list1列表中
list1=sht.range('A1:C1').value

# 将1,2,3分别写入了A1,A2,A3单元格中
sht.range('A1').options(transpose=True).value=[1,2,3]

# 将A1,A2,A3单元格中值存入list1列表中
list1=sht.range('A1:A3').value
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.二维数据

python的二维列表,可以转换为Excel中的行列。二维列表,即列表中的元素还是列表。在Excel中,二维列表中的列表元素,代表Excel表格中的一列。例如:

# 将a1,a2,a3输入第一列,b1,b2,b3输入第二列
list1=[[‘a1’,'a2','a3'],['b1','b2','b3']]
sht.range('A1').value=list1
  • 1
  • 2
  • 3

image-20200820110309649

# 将A1:B3的值赋给二维列表list1
list1=sht.range('A1:B3').value
  • 1
  • 2

3.Excel中区域的选取表格

# 选取第一列
rng=sht. range('A1').expand('down')
rng.value=['a1','a2','a3']
  • 1
  • 2
  • 3

image-20200820110410633

# 选取第一行
rng=sht.range('A1').expand('right')
rng=['a1','b1']
  • 1
  • 2
  • 3

image-20200820110428360

# 选取表格
rng.sht.range('A1').expand('table')
rng.value=[[‘a1’,'a2','a3'],['b1','b2','b3']]
  • 1
  • 2
  • 3

image-20200820110508919

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          # 用来设置图表的标题。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

示例代码:

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'
阅读(3677) 评论(0)