Python操作Excel教程

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

目录

Python Excel库对比

1 Python xlrd 读取 操作Excel

1.1 xlrd模块介绍

1.2 安装xlrd模块

1.3 使用介绍

1.4 实战训练

2 Python xlwt 写入 操作Excel(仅限xls格式!)

2.1 pip安装xlwt

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

2.3 xlwt 设置字体格式

2.4 xlwt 设置列宽

2.5 xlwt 设置行高

2.6 xlwt 合并列和行

2.7 xlwt 添加边框

2.8 xlwt为单元格设置背景色

2.9 xlwt设置单元格对齐

3 Python xlutils 修改 操作Excel

3.1 pip安装xlutils

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

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

4 Python xlwings 读取 写入 修改 操作Excel

4.1 pip安装xlwings

4.2 基本操作

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

4.4 写入&读取数据

4.5 常用函数和方法

4.6 数据结构

4.7 xlwings生成图表

4.8 实战训练

4.9 更多请参考

5 Python openpyxl 读取 写入 修改 操作Excel

5.1 openpyxl 基本操作

5.2 openpyxl生成2D图表

5.3 openpyxl生成3D图表

5.4 实战训练

6 Python xlswriter 写入 操作Excel

6.1 xlswriter基本操作

6.3 xlswriter 生成折线图

6.4 xlswriter 生成柱状图

6.5 xlswriter 生成饼图

6.6 实战训练

7 Python win32com 读取 写入 修改 操作Excel

7.1 pip安装win32com

7.2 Python使用win32com读写Excel

8 Python pandas 读取 写入 操作Excel

8.1 pip安装pandas

8.2 pandas 读写 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文件)中一个工作表


   
   
  1. table = data.sheets()[0] #通过索引顺序获取
  2. table = data.sheet_by_index(sheet_indx) #通过索引顺序获取
  3. table = data.sheet_by_name(sheet_name) #通过名称获取
  4. # 以上三个函数都会返回一个xlrd.sheet.Sheet()对象
  5. names = data.sheet_names() #返回book中所有工作表的名字
  6. data.sheet_loaded(sheet_name or indx) # 检查某个sheet是否导入完毕

(2) 行的操作


   
   
  1. nrows = table.nrows
  2. # 获取该sheet中的行数,注,这里 table.nrows后面不带().
  3. table.row(rowx)
  4. # 返回由该行中所有的单元格对象组成的列表,这与tabel.raw()方法并没有区别。
  5. table.row_slice(rowx)
  6. # 返回由该行中所有的单元格对象组成的列表
  7. table.row_types(rowx, start_colx = 0, end_colx =None)
  8. # 返回由该行中所有单元格的数据类型组成的列表;
  9. # 返回值为逻辑值列表,若类型为empy则为 0,否则为 1
  10. table.row_ values(rowx, start_colx = 0, end_colx =None)
  11. # 返回由该行中所有单元格的数据组成的列表
  12. table.row_len(rowx)
  13. # 返回该行的有效单元格长度,即这一行有多少个数据

在这里插入图片描述
(3)列(colnum)的操作


   
   
  1. ncols = table.ncols
  2. # 获取列表的有效列数
  3. table. col(colx, start_rowx = 0, end_rowx =None)
  4. # 返回由该列中所有的单元格对象组成的列表
  5. table. col_slice(colx, start_rowx = 0, end_rowx =None)
  6. # 返回由该列中所有的单元格对象组成的列表
  7. table. col_types(colx, start_rowx = 0, end_rowx =None)
  8. # 返回由该列中所有单元格的数据类型组成的列表
  9. table. col_ values(colx, start_rowx = 0, end_rowx =None)
  10. # 返回由该列中所有单元格的数据组成的列表

在这里插入图片描述
(4)单元格的操作


   
   
  1. table.cell(rowx,colx)
  2. # 返回单元格对象
  3. table.cell_ type(rowx,colx)
  4. # 返回对应位置单元格中的数据类型
  5. table.cell_ value(rowx,colx)
  6. # 返回对应位置单元格中的数据

1.4 实战训练

我们先在表格放入以下数据,点击保存:
在这里插入图片描述
使用xlrd模块进行读取:


   
   
  1. import xlrd
  2. xlsx = xlrd. open_workbook( './3_1 xlrd 读取 操作练习.xlsx')
  3. # 通过sheet名查找:xlsx.sheet_ by_name( "sheet1")
  4. # 通过索引查找:xlsx.sheet_ by_inde x(3)
  5. table = xlsx.sheet_ by_inde x(0)
  6. # 获取单个表格值 ( 2,1)表示获取第 3行第 2列单元格的值
  7. value = table.cell_ value( 2, 1)
  8. print( "第3行2列值为", value)
  9. # 获取表格行数
  10. nrows = table.nrows
  11. print( "表格一共有",nrows, "行")
  12. # 获取第 4列所有值(列表生成式)
  13. name_list = [str( table.cell_ value(i, 3)) for i in range( 1, nrows)]
  14. 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


   
   
  1. pip install xlwt

我这里是anaconda自带有xlwt,所以提示已经安装:
在这里插入图片描述

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

一开始目录下只有这两个文件:
在这里插入图片描述
编写xlwt新表格写入程序:


   
   
  1. # 3.2.2 使用xlwt创建新表格并写入
  2. def fun 3_ 2_ 2():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. worksheet. write( 2,1, "内容2")
  10. # 保存
  11. workbook.save( "新创建的表格.xls")

在这里插入图片描述
生成的表格内容如下:
在这里插入图片描述

2.3 xlwt 设置字体格式

程序示例:


   
   
  1. # 3.2.3 xlwt设置字体格式
  2. def fun 3_ 2_ 3():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 初始化样式
  8. style = xlwt.XFStyle()
  9. # 为样式创建字体
  10. font = xlwt.Font()
  11. font.name = 'Times New Roman' #字体
  12. font.bold = True #加粗
  13. font.underline = True #下划线
  14. font.italic = True #斜体
  15. # 设置样式
  16. style.font = font
  17. # 往表格写入内容
  18. worksheet. write( 0,0, "内容1")
  19. worksheet. write( 2,1, "内容2",style)
  20. # 保存
  21. workbook.save( "新创建的表格.xls")

效果如下:
在这里插入图片描述

2.4 xlwt 设置列宽

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

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

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

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

程序示例:


   
   
  1. # 3.2.4 设置列宽
  2. def fun 3_ 2_ 4():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. worksheet. write( 2,1, "内容2")
  10. # 设置列宽
  11. worksheet. col( 0).width = 256 * 20
  12. # 保存
  13. workbook.save( "新创建的表格.xls")

效果如下:
在这里插入图片描述

2.5 xlwt 设置行高

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

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

程序示例:


   
   
  1. # 3.2.5 设置行高
  2. def fun 3_ 2_ 5():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. worksheet. write( 2,1, "内容2")
  10. # 设置行高
  11. style = xlwt.easyxf( 'font:height 360;') # 18pt,类型小初的字号
  12. row = worksheet.row( 0)
  13. row. set_style(style)
  14. # 保存
  15. workbook.save( "新创建的表格.xls")

效果如下:
在这里插入图片描述

2.6 xlwt 合并列和行

程序示例:


   
   
  1. # 3.2.6 合并列和行
  2. def fun 3_ 2_ 6():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. # 合并 第 1行到第 2行 的 第 0列到第 3
  10. worksheet. write_ merge( 1, 2, 0, 3, 'Merge Test')
  11. # 保存
  12. workbook.save( "新创建的表格.xls")

效果如下:
在这里插入图片描述

2.7 xlwt 添加边框

程序示例:


   
   
  1. # 3.2.7 添加边框
  2. def fun 3_ 2_ 7():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. # 设置边框样式
  10. borders = xlwt.Borders() # Create Borders
  11. # May be: NO_ LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR,
  12. # MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED,
  13. # MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x 00 through 0x 0D.
  14. # DASHED虚线
  15. # NO_ LINE没有
  16. # THIN实线
  17. borders. left = xlwt.Borders.DASHED
  18. borders. right = xlwt.Borders.DASHED
  19. borders. top = xlwt.Borders.DASHED
  20. borders. bottom = xlwt.Borders.DASHED
  21. borders. left_colour = 0x 40
  22. borders. right_colour = 0x 40
  23. borders. top_colour = 0x 40
  24. borders. bottom_colour = 0x 40
  25. style = xlwt.XFStyle() # Create Style
  26. style.borders = borders # Add Borders to Style
  27. worksheet. write( 0, 0, '内容1', style)
  28. worksheet. write( 2,1, "内容2")
  29. # 保存
  30. workbook.save( "新创建的表格.xls")

效果如下:
在这里插入图片描述

2.8 xlwt为单元格设置背景色

程序示例:


   
   
  1. # 设置单元格背景色
  2. def fun 3_ 2_ 8():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. # 创建样式
  10. pattern = xlwt.Pattern()
  11. # May be: NO_PATTERN, SOLID_PATTERN, or 0x 00 through 0x 12
  12. pattern.pattern = xlwt.Pattern.SOLID_PATTERN
  13. # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow,
  14. # 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow ,
  15. # almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
  16. pattern.pattern_fore_colour = 5
  17. style = xlwt.XFStyle()
  18. style.pattern = pattern
  19. # 使用样式
  20. 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 右端对齐

程序示例:


   
   
  1. # 设置单元格对齐
  2. def fun 3_ 2_ 9():
  3. # 创建新的workbook(其实就是创建新的excel)
  4. workbook = xlwt.Workbook(encoding = 'ascii')
  5. # 创建新的sheet表
  6. worksheet = workbook. add_sheet( "My new Sheet")
  7. # 往表格写入内容
  8. worksheet. write( 0,0, "内容1")
  9. # 设置样式
  10. style = xlwt.XFStyle()
  11. al = xlwt.Alignment()
  12. # VERT_ TOP = 0x 00 上端对齐
  13. # VERT_CENTER = 0x 01 居中对齐(垂直方向上)
  14. # VERT_ BOTTOM = 0x 02 低端对齐
  15. # HORZ_ LEFT = 0x 01 左端对齐
  16. # HORZ_CENTER = 0x 02 居中对齐(水平方向上)
  17. # HORZ_ RIGHT = 0x 03 右端对齐
  18. al.horz = 0x 02 # 设置水平居中
  19. al.vert = 0x 01 # 设置垂直居中
  20. style.alignment = al
  21. # 对齐写入
  22. worksheet. write( 2,1, "内容2",style)
  23. # 保存
  24. 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使用)

在这里插入图片描述
表格内容如下:
在这里插入图片描述
程序示例:


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

效果如下:
在这里插入图片描述
内容为:
在这里插入图片描述
不过表格的样式全部消失了。

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

程序示例:


   
   
  1. # 3.3.3 xlutils读取 写入 Excel 表格信息
  2. def fun 3_ 3_ 3():
  3. # file_path:文件路径,包含文件的全名称
  4. # formatting_info = True:保留Excel的原格式(使用与xlsx文件)
  5. workbook = xlrd. open_workbook( '3_3 xlutils 修改操作练习.xlsx')
  6. new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
  7. # 读取表格信息
  8. sheet = workbook.sheet_ by_inde x(0)
  9. col 2 = sheet. col_ values( 1) # 取出第二列
  10. cel_ value = sheet.cell_ value( 1, 1)
  11. print( col 2)
  12. print(cel_ value)
  13. # 写入表格信息
  14. write_save = new_workbook. get_sheet( 0)
  15. write_save. write( 0, 0, "xlutils写入!")
  16. 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程序,默认设置:程序可见,只打开不新建工作薄


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

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


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

保存工作簿

wb.save('example.xlsx')

   
   

退出工作簿(可省略)

wb.close()

   
   

退出Excel

app.quit()

   
   

三个例子:
(1)打开已存在的Excel文档


   
   
  1. # 导入xlwings模块
  2. import xlwings as xw
  3. # 打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
  4. app=xw.App(visible= True,add_book= False)
  5. app.display_alerts= False
  6. app.screen_updating= False
  7. # 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
  8. filepath= r'g:\Python Scripts\test.xlsx'
  9. wb=app.books. open(filepath)
  10. wb.save()
  11. wb.close()
  12. app.quit()

(2)新建Excel文档,命名为test.xlsx,并保存在D盘


   
   
  1. import xlwings as xw
  2. app=xw.App(visible= True,add_book= False)
  3. wb=app.books.add()
  4. wb.save( r'd:\test.xlsx')
  5. wb.close()
  6. app.quit()

(3)在单元格输入值

新建test.xlsx,在sheet1的第一个单元格输入 “人生” ,然后保存关闭,退出Excel程序。


   
   
  1. import xlwings as xw
  2. app=xw.App(visible= True,add_book= False)
  3. wb=app.books.add()
  4. # wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
  5. wb.sheets[ 'sheet1']. range( 'A1').value= '人生'
  6. wb.save( r'd:\test.xlsx')
  7. wb.close()
  8. app.quit()

打开已保存的test.xlsx,在sheet2的第二个单元格输入“苦短”,然后保存关闭,退出Excel程序


   
   
  1. import xlwings as xw
  2. app=xw.App(visible= True,add_book= False)
  3. wb=app.books. open( r'd:\test.xlsx')
  4. # wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
  5. wb.sheets[ 'sheet1']. range( 'A1').value= '苦短'
  6. wb.save()
  7. wb.close()
  8. app.quit()

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

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

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

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

   
   

(2)引用活动的工作薄

wb=xw.books.active

   
   

(3)引用工作簿中的sheet


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

(4)引用活动sheet

sht=xw.sheets.active

   
   

(5)引用A1单元格


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

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


   
   
  1. # 注意Range首字母大写
  2. rng =xw.Range( 'A1')
  3. #其中需要注意的是单元格的完全引用路径是:
  4. # 第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
  5. xw.apps[ 0].books[ 0].sheets[ 0].range( 'A1')
  6. 迅速引用单元格的方式是
  7. sht =xw.books[ '名字'].sheets[ '名字']
  8. # A 1单元格
  9. rng =sht[’A 1 ']
  10. # A1:B5单元格
  11. rng=sht['A 1:B 5 ']
  12. # 在第i+1行,第j+1列的单元格
  13. # B1单元格
  14. rng=sht[0,1]
  15. # A1:J10
  16. rng=sht[:10,:10]
  17. #PS: 对于单元格也可以用表示行列的tuple进行引用
  18. # A1单元格的引用
  19. xw.Range(1,1)
  20. #A1:C3单元格的引用
  21. xw.Range((1,1),(3,3))

引用单元格:


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

引用区域:


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

4.4 写入&读取数据

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

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

   
   

(2)写入列表


   
   
  1. # 行存储:将列表[ 1,2,3]储存在A 1:C 1
  2. sht.range( 'A1'). value =[ 1,2,3]
  3. # 列存储:将列表[ 1,2,3]储存在A 1:A 3
  4. sht.range( 'A1'). options(transpose = True). value =[ 1,2,3]
  5. # 将 2x 2表格,即二维数组,储存在A 1:B 2中,如第一行 12,第二行 34
  6. 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)读取单个值


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

(2)将值读取到列表中


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

选取一列的数据
先计算单元格的行数(前提是连续的单元格)


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

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

a = sht.range(f'a1:a{nrows}').value

   
   

选取一行的数据


   
   
  1. ncols = rng. columns. count
  2. #用切片
  3. fst_ col = sht[ 0,:ncols]. value

4.5 常用函数和方法

1.Book工作薄常用的api

wb=xw.books[‘工作簿名称']

   
   

   
   
  1. wb .activate() 激活为当前工作簿
  2. wb .fullname 返回工作簿的绝对路径
  3. wb .name 返回工作簿的名称
  4. wb .save(path=None) 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
  5. wb. close() 关闭工作簿

代码示例:


   
   
  1. # 引用Excel程序中,当前的工作簿
  2. wb =xw.books.acitve
  3. # 返回工作簿的绝对路径
  4. x =wb.fullname
  5. # 返回工作簿的名称
  6. x =wb.name
  7. # 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
  8. x =wb.save(path =None)
  9. # 关闭工作簿
  10. x =wb. close()

2.sheet常用的api


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

3.range常用的api


   
   
  1. # 引用当前活动工作表的单元格
  2. rng=xw.Range( 'A1')
  3. # 加入超链接
  4. # rng.add_hyperlink(r'www.baidu.com','百度',‘提示:点击即链接到百度')
  5. # 取得当前range的地址
  6. rng.address
  7. rng.get_address()
  8. # 清除range的内容
  9. rng.clear_contents()
  10. # 清除格式和内容
  11. rng.clear()
  12. # 取得range的背景色,以元组形式返回RGB值
  13. rng.color
  14. # 设置range的颜色
  15. rng.color=( 255, 255, 255)
  16. # 清除range的背景色
  17. rng.color= None
  18. # 获得range的第一列列标
  19. rng.column
  20. # 返回range中单元格的数据
  21. rng.count
  22. # 返回current_region
  23. rng.current_region
  24. # 返回ctrl + 方向
  25. rng.end( 'down')
  26. # 获取公式或者输入公式
  27. rng.formula= '=SUM(B1:B5)'
  28. # 数组公式
  29. rng.formula_array
  30. # 获得单元格的绝对地址
  31. rng.get_address(row_absolute= True, column_absolute= True,include_sheetname= False, external= False)
  32. # 获得列宽
  33. rng.column_width
  34. # 返回range的总宽度
  35. rng.width
  36. # 获得range的超链接
  37. rng.hyperlink
  38. # 获得range中右下角最后一个单元格
  39. rng.last_cell
  40. # range平移
  41. rng.offset(row_offset= 0,column_offset= 0)
  42. #range进行resize改变range的大小
  43. rng.resize(row_size= None,column_size= None)
  44. # range的第一行行标
  45. rng.row
  46. # 行的高度,所有行一样高返回行高,不一样返回None
  47. rng.row_height
  48. # 返回range的总高度
  49. rng.height
  50. # 返回range的行数和列数
  51. rng.shape
  52. # 返回range所在的sheet
  53. rng.sheet
  54. #返回range的所有行
  55. rng.rows
  56. # range的第一行
  57. rng.rows[ 0]
  58. # range的总行数
  59. rng.rows.count
  60. # 返回range的所有列
  61. rng.columns
  62. # 返回range的第一列
  63. rng.columns[ 0]
  64. # 返回range的列数
  65. rng.columns.count
  66. # 所有range的大小自适应
  67. rng.autofit()
  68. # 所有列宽度自适应
  69. rng.columns.autofit()
  70. # 所有行宽度自适应
  71. rng.rows.autofit()

4.books 工作簿集合的api


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

5.sheets 工作表的集合


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

4.6 数据结构

1.一维数据

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


   
   
  1. import xlwings as xw
  2. sht =xw.sheets.active
  3. # 将 123分别写入了A 1,B 1,C 1单元格中
  4. sht.range( 'A1'). value =[ 1,2,3]
  5. # 将A 1,B 1,C 1单元格的值存入list 1列表中
  6. list 1 =sht.range( 'A1:C1'). value
  7. # 将 123分别写入了A 1,A 2,A 3单元格中
  8. sht.range( 'A1'). options(transpose = True). value =[ 1,2,3]
  9. # 将A 1,A 2,A 3单元格中值存入list 1列表中
  10. list 1 =sht.range( 'A1:A3'). value

2.二维数据

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


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

在这里插入图片描述


   
   
  1. # 将A 1:B 3的值赋给二维列表list 1
  2. list 1 =sht.range( 'A1:B3'). value

3.Excel中区域的选取表格


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

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述

4.7 xlwings生成图表

生成图表的方法


   
   
  1. import xlwings as xw
  2. app = xw.App()
  3. wb = app.books.active
  4. sht = wb.sheets.active
  5. chart = sht.charts. add( 100, 10) # 100, 10 为图表放置的位置坐标。以像素为单位。
  6. chart. set_ source_ data(sht.range( 'A1').expand()) # 参数为表格中的数据区域。
  7. # chart.chart_ type = i # 用来设置图表类型,具体参数件下面详细说明。
  8. chart.api[ 1].ChartTitle.Text = i # 用来设置图表的标题。

示例代码:


   
   
  1. import xlwings as xw
  2. app = xw.App()
  3. wb = app.books.active
  4. sht = wb.sheets.active
  5. # 生成图表的数据
  6. sht.range( 'A1'). value = [[ '时间', '数量'], [ '1日', 2], [ '2日', 1], [ '3日', 3]
  7. , [ '4日', 4], [ '5日', 5], [ '6日', 6]]
  8. "" "图表类型参数,被注释的那几个,无法生成对应的图表" ""
  9. dic = {
  10. '3d_area': - 4098,
  11. '3d_area_stacked': 78,
  12. '3d_area_stacked_100': 79,
  13. '3d_bar_clustered': 60,
  14. '3d_bar_stacked': 61,
  15. '3d_bar_stacked_100': 62,
  16. '3d_column': - 4100,
  17. '3d_column_clustered': 54,
  18. '3d_column_stacked': 55,
  19. '3d_column_stacked_100': 56,
  20. '3d_line': - 4101,
  21. '3d_pie': - 4102,
  22. '3d_pie_exploded': 70,
  23. 'area': 1,
  24. 'area_stacked': 76,
  25. 'area_stacked_100': 77,
  26. 'bar_clustered': 57,
  27. 'bar_of_pie': 71,
  28. 'bar_stacked': 58,
  29. 'bar_stacked_100': 59,
  30. 'bubble': 15,
  31. 'bubble_3d_effect': 87,
  32. 'column_clustered': 51,
  33. 'column_stacked': 52,
  34. 'column_stacked_100': 53,
  35. 'cone_bar_clustered': 102,
  36. 'cone_bar_stacked': 103,
  37. 'cone_bar_stacked_100': 104,
  38. 'cone_col': 105,
  39. 'cone_col_clustered': 99,
  40. 'cone_col_stacked': 100,
  41. 'cone_col_stacked_100': 101,
  42. 'cylinder_bar_clustered': 95,
  43. 'cylinder_bar_stacked': 96,
  44. 'cylinder_bar_stacked_100': 97,
  45. 'cylinder_col': 98,
  46. 'cylinder_col_clustered': 92,
  47. 'cylinder_col_stacked': 93,
  48. 'cylinder_col_stacked_100': 94,
  49. 'doughnut': - 4120,
  50. 'doughnut_exploded': 80,
  51. 'line': 4,
  52. 'line_markers': 65,
  53. 'line_markers_stacked': 66,
  54. 'line_markers_stacked_100': 67,
  55. 'line_stacked': 63,
  56. 'line_stacked_100': 64,
  57. 'pie': 5,
  58. 'pie_exploded': 69,
  59. 'pie_of_pie': 68,
  60. 'pyramid_bar_clustered': 109,
  61. 'pyramid_bar_stacked': 110,
  62. 'pyramid_bar_stacked_100': 111,
  63. 'pyramid_col': 112,
  64. 'pyramid_col_clustered': 106,
  65. 'pyramid_col_stacked': 107,
  66. 'pyramid_col_stacked_100': 108,
  67. 'radar': - 4151,
  68. 'radar_filled': 82,
  69. 'radar_markers': 81,
  70. # 'stock_hlc': 88,
  71. # 'stock_ohlc': 89,
  72. # 'stock_vhlc': 90,
  73. # 'stock_vohlc': 91,
  74. # 'surface': 83,
  75. # 'surface_top_view': 85,
  76. # 'surface_top_view_wireframe': 86,
  77. # 'surface_wireframe': 84,
  78. 'xy_scatter': - 4169,
  79. 'xy_scatter_lines': 74,
  80. 'xy_scatter_lines_no_markers': 75,
  81. 'xy_scatter_smooth': 72,
  82. 'xy_scatter_smooth_no_markers': 73
  83. }
  84. w = 385
  85. h = 241
  86. n = 0
  87. x = 100
  88. y = 10
  89. for i in dic.keys():
  90. xx = x + n % 3 *w # 用来生成图表放置的x坐标。
  91. yy = y + n / / 3 *h # 用来生成图表放置的y坐标。
  92. chart = sht.charts. add(xx, yy)
  93. chart. set_ source_ data(sht.range( 'A1').expand())
  94. chart.chart_ type = i
  95. chart.api[ 1].ChartTitle.Text = i
  96. n + = 1
  97. wb.save( 'chart_图表')
  98. wb. close()
  99. app.quit()

效果如下:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.8 实战训练

  1. xlwings 新建 Excel 文档
    在这里插入图片描述
    程序示例:

   
   
  1. # 3.4.2 xlwings 新建 Excle 文档
  2. def fun3_4_2():
  3. """
  4. visible
  5. Ture:可见excel
  6. False:不可见excel
  7. add_book
  8. True:打开excel并且新建工作簿
  9. False:不新建工作簿
  10. """
  11. app = xw.App(visible= True, add_book= False)
  12. # 新建工作簿 (如果不接下一条代码的话,Excel只会一闪而过,卖个萌就走了)
  13. wb = app.books.add()
  14. # 保存工作簿
  15. wb.save( 'example.xlsx')
  16. # 退出工作簿
  17. wb.close()
  18. # 退出Excel
  19. app.quit()

执行程序后文件夹增加了“example.xlsx”:
在这里插入图片描述
此时表格是空的:
在这里插入图片描述
2. xlwings 打开已存在的 Excel 文档

现有表格长这样:
在这里插入图片描述
运行程序:


   
   
  1. # 3.4.3 xlwings 打开已存在的Excel文件
  2. def fun 3_ 4_ 3():
  3. # 新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
  4. app = xw.App(visible = True, add_book = False)
  5. app. display_alerts = False
  6. app. screen_updating = False
  7. # 打开已存在的Excel文件
  8. wb =app.books. open( './3_4 xlwings 修改操作练习.xlsx')
  9. # 保存工作簿
  10. wb.save( 'example_2.xlsx')
  11. # 退出工作簿
  12. wb. close()
  13. # 退出Excel
  14. app.quit()

生成新的表格:
在这里插入图片描述
内容如下:
在这里插入图片描述
3. xlwings 读写 Excel

程序示例:


   
   
  1. # 3.4.4 xlwings读写 Excel
  2. def fun 3_ 4_ 4():
  3. # 新建Excle 默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
  4. app = xw.App(visible = True, add_book = False)
  5. app. display_alerts = False
  6. app. screen_updating = False
  7. # 打开已存在的Excel文件
  8. wb =app.books. open( './3_4 xlwings 修改操作练习.xlsx')
  9. # 获取sheet对象
  10. print(wb.sheets)
  11. sheet = wb.sheets[ 0]
  12. # sheet = wb.sheets[ "sheet1"]
  13. # 读取Excel信息
  14. cellB 1_ value = sheet.range( 'B1'). value
  15. print( "单元格B1内容为:",cellB 1_ value)
  16. # 清除单元格内容和格式
  17. sheet.range( 'A1').clear()
  18. # 写入单元格
  19. sheet.range( 'A1'). value = "xlwings写入"
  20. # 保存工作簿
  21. wb.save( 'example_3.xlsx')
  22. # 退出工作簿
  23. wb. close()
  24. # 退出Excel
  25. 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/

官方示例:


   
   
  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. # grab the active worksheet
  4. ws = wb.active
  5. # Data can be assigned directly to cells
  6. ws[ 'A1'] = 42
  7. # Rows can also be appended
  8. ws.append([ 1, 2, 3])
  9. # Python types will automatically be converted
  10. import datetime
  11. ws[ 'A2'] = datetime.datetime.now()
  12. # Save the file
  13. wb.save( "sample.xlsx")

5.1 openpyxl 基本操作

1.安装
pip install openpyxl
因为我已经安装,所以提示如下信息:
在这里插入图片描述
2.打开文件
(1)新建


   
   
  1. from openpyxl import Workbook
  2. # 实例化
  3. wb = Workbook()
  4. # 激活 worksheet
  5. ws = wb.active

(2)打开已有


   
   
  1. from openpyxl import load_workbook
  2. wb = load_workbook( '文件名称.xlsx')

3.写入数据


   
   
  1. # 方式一:数据可以直接分配到单元格中(可以输入公式)
  2. ws[ 'A1'] = 42
  3. # 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
  4. ws.append([ 1, 2, 3])
  5. # 方式三:Python 类型会被自动转换
  6. ws[ 'A3'] = datetime.datetime.now().strftime( "%Y-%m-%d")

4.创建表(sheet)


   
   
  1. # 方式一:插入到最后( default)
  2. ws 1 = wb.create_sheet( "Mysheet")
  3. # 方式二:插入到最开始的位置
  4. ws 2 = wb.create_sheet( "Mysheet", 0)

5.选择表(sheet)


   
   
  1. # sheet 名称可以作为 key 进行索引
  2. >>> ws3 = wb[ "New Title"]
  3. >>> ws4 = wb.get_sheet_by_name( "New Title")
  4. >>> ws is ws3 is ws4
  5. True

6.查看表名(sheet)


   
   
  1. # 显示所有表名
  2. >>> print(wb.sheetnames)
  3. [ 'Sheet2', 'New Title', 'Sheet1']
  4. # 遍历所有表
  5. >>> for sheet in wb:
  6. ... print(sheet.title)

7.访问单元格(cell)
(1)单个单元格访问


   
   
  1. # 方法一
  2. >>> c = ws[ 'A4']
  3. # 方法二:row 行;column 列
  4. >>> d = ws.cell(row= 4, column= 2, value= 10)
  5. # 方法三:只要访问就创建
  6. >>> for i in range( 1, 101):
  7. ... for j in range( 1, 101):
  8. ... ws.cell(row=i, column=j)

(2)多个单元格访问


   
   
  1. # 通过切片
  2. >>> cell_range = ws['A1':'C2']
  3. # 通过行(列)
  4. >>> colC = ws['C']
  5. >>> col_range = ws['C:D']
  6. >>> row10 = ws[10]
  7. >>> row_range = ws[5:10]
  8. # 通过指定范围(行 → 行)
  9. >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
  10. ... for cell in row:
  11. ... print(cell)
  12. <Cell Sheet 1.A 1 >
  13. <Cell Sheet 1.B 1 >
  14. <Cell Sheet 1.C 1 >
  15. <Cell Sheet 1.A 2 >
  16. <Cell Sheet 1.B 2 >
  17. <Cell Sheet 1.C 2 >
  18. # 通过指定范围(列 → 列)
  19. >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
  20. ... for cell in row:
  21. ... print(cell)
  22. <Cell Sheet 1.A 1 >
  23. <Cell Sheet 1.B 1 >
  24. <Cell Sheet 1.C 1 >
  25. <Cell Sheet 1.A 2 >
  26. <Cell Sheet 1.B 2 >
  27. <Cell Sheet 1.C 2 >
  28. # 遍历所有 方法一
  29. >>> ws = wb.active
  30. >>> ws['C9'] = 'hello world'
  31. >>> tuple(ws.rows)
  32. (( <Cell Sheet.A 1 >, <Cell Sheet.B 1 >, <Cell Sheet.C 1 >),
  33. ( <Cell Sheet.A 2 >, <Cell Sheet.B 2 >, <Cell Sheet.C 2 >),
  34. ...
  35. ( <Cell Sheet.A 8 >, <Cell Sheet.B 8 >, <Cell Sheet.C 8 >),
  36. ( <Cell Sheet.A 9 >, <Cell Sheet.B 9 >, <Cell Sheet.C 9 >))
  37. # 遍历所有 方法二
  38. >>> tuple(ws.columns)
  39. (( <Cell Sheet.A 1 >,
  40. <Cell Sheet.A 2 >,
  41. <Cell Sheet.A 3 >,
  42. ...
  43. <Cell Sheet.B 7 >,
  44. <Cell Sheet.B 8 >,
  45. <Cell Sheet.B 9 >),
  46. ( <Cell Sheet.C 1 >,
  47. ...
  48. <Cell Sheet.C 8 >,
  49. <Cell Sheet.C 9 >))

8.保存数据

wb.save('文件名称.xlsx')

   
   

9.其它
(1)改变sheet标签按钮颜色

ws.sheet_properties.tabColor = "1072BA" # 色值为RGB16进制值

   
   

(2)获取最大行,最大列


   
   
  1. # 获得最大列和最大行
  2. print(sheet.max_row)
  3. print(sheet.max_column)

(3)获取每一行每一列

sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
sheet.columns类似,不过里面是每个tuple是每一列的单元格。


   
   
  1. # 因为按行,所以返回A 1, B 1, C 1这样的顺序
  2. for row in sheet.rows:
  3. for cell in row:
  4. print(cell. value)
  5. # A 1, A 2, A 3这样的顺序
  6. for column in sheet. columns:
  7. for cell in column:
  8. print(cell. value)

(4)根据数字得到字母,根据字母得到数字


   
   
  1. from openpyxl.utils import get_ column_letter, column_ index_ from_ string
  2. # 根据列的数字返回字母
  3. print( get_ column_letter( 2)) # B
  4. # 根据字母返回列的数字
  5. print( column_ index_ from_ string( 'D')) # 4

(5)删除工作表


   
   
  1. # 方式一
  2. wb. remove(sheet)
  3. # 方式二
  4. del wb[sheet]

(6)矩阵置换


   
   
  1. rows = [
  2. [ 'Number', 'data1', 'data2'],
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值