zoukankan      html  css  js  c++  java
  • xlwings使用教程

    (一)

    python操作Excel的模块,网上提到的模块大致有:xlwings、xlrd、xlwt、openpyxl、pyxll等,他们提供的功能归纳起来有两种:一、用python读写Excel文件,实际上就是读写有格式的文本文件,操作excel文件和操作text、csv文件没有区别,Excel文件只是用来储存数据。二、除了操作数据,还可以调整Excel文件的表格宽度、字体颜色等。另外需要提到的是用COM调用Excel的API操作Excel文档也是可行的,相当麻烦基本和VBA没有区别。

    xlwings官网.png


    xlwings的特色

    • xlwings能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改
    • 可以和matplotlib以及pandas无缝连接
    • 可以调用Excel文件中VBA写好的程序,也可以让VBA调用用Python写的程序。
    • 开源免费,一直在更新

    基本操作

    xlwings基本对象

    1. 打开已保存的Excel文档
      # 导入xlwings模块,打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
      import xlwings as xw
      app=xw.App(visible=True,add_book=False)
      app.display_alerts=False
      app.screen_updating=False
      # 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
      filepath=r'g:Python Scripts est.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: est.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: est.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: est.xlsx')
      # wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
      wb.sheets['sheet1'].range('A1').value='苦短'
      wb.save()
      wb.close()
      app.quit()
      掌握以上代码,已经完全可以把Excel当作一个txt文本进行数据储存了,也可以读取Excel文件的数据,进行计算后,并将结果保存在Excel中。

    引用工作簿、工作表和单元格

    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['名字']
      # 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. 储存单个值
      # 注意".value“
      sht.range('A1').value=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').value=[[1,2],[3,4]]

    读取数据

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

    (二)

    在上一篇插上翅膀,让Excel飞起来——xlwings(一)中提到利用xlwings模块,用python操作Excel有如下的优点:

    • xlwings能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改
    • 可以和matplotlib以及pandas无缝连接
    • 可以调用Excel文件中VBA写好的程序,也可以让VBA调用用Python写的程序。
    • 开源免费,一直在更新

    本文紧接着上文介绍了xlwings模块一些常用的api

    xlwings基本对象

    常用函数和方法

    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

    实例

    大Z老师,教了小z同学怎么用python操作Excel之后,利用第一篇和第二篇的知识,编写了一个python小脚本,给小Z同学演示了一下怎么用python调整单元格的行宽、列宽和背景色,做一些Interesting的事。

    大Z老师的作品.png

    小Z同学在看了这么cliche但是好玩的东西之后,自己果断地修改了代码,改变了单元格的颜色,并在sheet里面进行了题字,然后,便有新的作品:

    小z的作品.png

    下一课有机会教小z同学,利用python自带的time模块,让Excel中静态的画和字动起来,成为像gif一样的图片。

    (三)

    【剧情回顾】

    1. xlwings基本对象

       

      xlwings基本对象

       

      App相当于Excel程序,Book相当于工作簿。N个Excel程序则由apps表示,N个工作簿由books表示。

    2. 对工作簿的操作
    1.  
      #导入xlwings模块
    2.  
      import xlwings as xw
    3.  
      #新建工作簿,这里默认为新建了一个App,即打开Excel程序,并新建一个工作簿
    4.  
      xw.Book()
    5.  
      #引用工作簿
    6.  
      xw.Book('工作簿3')
    7.  
      # 引用工作簿也可以用books
    8.  
      xw.books['工作簿3’]
    9.  
      #打开已有工作簿
    10.  
      xw.Book(r'e:myworkbook.xlsx')
    1. 对sheet以及Range的操作
    1.  
      import xlwings as xw
    2.  
      wb=xw.Book()
    3.  
      # 引用名字为"sheet2"的sheet
    4.  
      sht=wb.sheets['sheet2']
    5.  
      # 引用"sheet2"中的B1单元格
    6.  
      rng=sht.range('B1')
    7.  
      # 将B1单元格的值改为666
    8.  
      rng.value=666

    数据结构

    1. 一维数据
      python的列表,可以和Excel中的行列进行数据交换,python中的一维列表,在Excel中默认为一行数据
    1.  
      import xlwings as xw
    2.  
      sht=xw.sheets.active
    3.  
      # 将1,2,3分别写入了A1,B1,C1单元格中
    4.  
      sht.range('A1').value=[1,2,3]
    5.  
      # 将A1,B1,C1单元格的值存入list1列表中
    6.  
      list1=sht.range('A1:C1').value
    7.  
      # 将1,2,3分别写入了A1,A2,A3单元格中
    8.  
      sht.range('A1').options(transpose=True).value=[1,2,3]
    9.  
      # 将A1,A2,A3单元格中值存入list1列表中
    10.  
      list1=sht.range('A1:A3').value
    1. 二维数据
      python的二维列表,可以转换为Excel中的行列。二维列表,即列表中的元素还是列表。在Excel中,二维列表中的列表元素,代表Excel表格中的一列。例如:
    1.  
      # 将a1,a2,a3输入第一列,b1,b2,b3输入第二列
    2.  
      list1=[[‘a1’,'a2','a3'],['b1','b2','b3']]
    3.  
      sht.range('A1').value=list1

    运行结果

    1.  
      # 将A1:B3的值赋给二维列表list1
    2.  
      list1=sht.range('A1:B3‘).value
    1. 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']]

    表格

    结束

    • 本文首先简单介绍了,通过Python运用xlwings模块,对Excel工作簿、工作表和单元格的操作。
    • 再介绍了xlwings,如何对Excel表格的行和列写入和引用数据
    • 通过二维或者一维列表对Excel工作表的数据进行写入或者引用,既简化了代码,也提高了程序的效率。因为python读写Excel表格的速度,原小于python程序自身的运行速度。

    (四)

    前言

    当年看《别怕,Excel VBA其实很简单》相见恨晚,看了第一版电子版之后,买了纸质版,然后将其送人。而后,发现出了第二版,买之收藏。之后,发现Python这一编程语言,简直是逆天,业余非程序员的福音。人生苦短,我用python。简短几句代码,实现好多自己不敢想的功能。
    自学VBA发现对VBA和python,我有着这样几个看法:(只是针对自动化办公)

    • 非专业表哥,只是普通办公,希望偶尔遇到点重复的工作可以自动化一下。VBA对于我来说,要记得东西还是太多了,语法上不简洁。每写一个功能,代码太长了。
    • VBA虽然在很多程序都有接口,但是,应用范围还是略窄,对于一般用户深入学习后,但是,应用场景太少。有任务驱动,才有动力去提高水平。
    • Python运行速度绝对不算快的,但是,绝对比在Excel中运行VBA的速度还是要快很多
    • Python语言简洁(python大法好),模块丰富,有好多大神造好的轮子等着我们去用。
    • Python应用范围广,既能帮我解决偶尔遇到的表格问题,也能和其他各种软件或者平台联接起来。

    运用Python自定义宏(仅限Windows)

    1. 准备工作
    2. 安装xlwings模块
    • 下载模版文件,百度网盘链接:xlwings自定义宏和函数模版

      文件列表


      其中,自定义模版可以修改名称,mymacro为自定义宏的python文件,myfun为自定义函数的python文件。
    • 设置Excel信任中心,信任对VBA工程对象模型的访问

       

      信任中心设置

    1. 自定义宏
      用记事本打开mymacro0,输入下列语句:
    1.  
      import xlwings as xw
    2.  
      @xw.sub
    3.  
      def my_macro():
    4.  
      wb = xw.Book.caller()
    5.  
      wb.sheets[0].range('A1').value = wb.name

    则宏名称为my_macro的宏就编写好了,将工作簿的名称输入到A1单元格。自定义宏只需要前两句不变,后面内容自己编写,即自定义宏需要以下面的语句为开头

    1.  
      import xlwings as xw
    2.  
      @xw.sub

    运行方式:先alt+F8运行ImportPythonUDFs内置宏,导入我们的自定义宏和函数,导入后,再运行我定义的my_macro宏。

    执行

    1. 自定义函数
      准备工作是一致的,打开myfun0,写入第一个自定义函数:
    1.  
      import xlwings as xw
    2.  
      @xw.func
    3.  
      def myfun():
    4.  
      wb = xw.Book.caller()
    5.  
      return wb.name

    注意,开头语句为@xw.func而不是@xw.sub了,然后函数相对于宏,有返回值,所以用了return语句。自定义好函数之后,刚可以像Excel自带函数一样的去使用了。如在A1单元格输入”=myfun()",则会得到工作簿的名称。

    结束

    本文给出了xlwings模块自定义宏和函数的模版,然后简单介绍了如何去定义宏和函数。注意:

    • 一个python文件,只能定义一个宏或者函数,所以模版中已经默认分别给出了三个宏和函数文件,方便直接使用。
    • python文件的名称和相对文件位置不能改变,Excel文件的文件位置不能改变,名称可以改变。如需修改,请参考xlwings官方文档。

    作者:LuckyFrog
    链接:https://www.jianshu.com/p/e21894fc5501
    来源:简书
    著作权归作者所有。

    参考资料:

    https://docs.xlwings.org/en/stable/index.html

    https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450

  • 相关阅读:
    ping与telnet的区别
    TCP连接的建立与关闭
    网络的7层协议
    oracle数据库中,分天查询数目
    求某个字符在字符串中的第5个位置
    高精度乘
    高精度加法
    二叉排序树(建树,先序,中序,后序遍历)
    求哈夫曼树的带权路径长度和
    HDU_1237_简单计算器
  • 原文地址:https://www.cnblogs.com/alphacode/p/13695753.html
Copyright © 2011-2022 走看看