zoukankan      html  css  js  c++  java
  • 【Python】 更棒的Excel操作模块xlwings

    【xlwings】

      说到Python操作Excel,有好多模块都可以支持这个工作。比如最底层的win32模块不仅可以操作Excel,还可以操作其他一众windows的软件。

      其他的比较熟悉的有xlrd,xlwt和xlutils这三个。分别负责Excel文件的读、写、读写转换工作。虽然一般情况下的Excel操作都可以通过这三个模块来完成,但是还是有很多不便的地方。比如单元格格式的写入和读取很麻烦,通过xlutils将一个Excel读取再写入到一个新文件中时格式也不会被一起复制过去。

      另外最近我遇到的需求就是,基于一个Excel模板,往里面填充数据。虽然可以将模板转化为xlwt的代码写死在生成脚本中,但是每次都要重新生成一个文件未免太过麻烦,而且一个格子一个格子地写入会让代码量飞速上涨。。无奈之下另寻他路,尝试着用了xlwings这个模块。

    ■  基本使用

      和xlrd等不同,xlwings设计的基础理念不是面向单个的Excel文档进行的,而是可以处理一个包含了多个Excel文档的“Excel项目”。通过建立其app等逻辑组分概念,可以让整个Excel项目可以更加有序方便地进行计算和互相通讯。xlwings中设计的各个模型的概念层级如下图所示:

      其中App是作为一个逻辑的分组,一个Book可以认为对应一个Excel文档,Sheet对应一张工作表,Range对应具体表中的一片区域的内容。首先,下面是一个最为常见的,打开一个Excel文档并进行处理的简单过程:

    import xlwings as xw
    
    book = xw.Book('/path/to/test.xlsx')
    # 此时界面上会弹出Excel窗口,如果test.xlsx文件不存在则会报错,如果test.xlsx已经被打开,直接返回这个文件对象
    
    print book.name,book.fullname    # 打印文件名和绝对路径
    print book.app    # 可以查看book所在哪个APP
    print book.sheets    # 又是一个类列表结构,存放各种Sheet对象
    book.activate()    # 如果Excel没有获得当前系统的焦点,调用这个方法可以回到Excel中去
    book.close()    # 关闭Excel文档,但只是关闭文件本身,不关闭excel程序。。若要关闭Excel程序则需要调用响应APP实例的kill方法。经过试验,先调用close会导致默认创建的app实例自动消失,从而无法调用kill,从而关不掉Excel
    所以最好的办法不是调用这个close而是调用app.kill()。
    sheet = book.sheets[0] # 其他获取sheet对象的方法还有book.sheets['sheet_name']

      上面说到了获取一个具体的sheet,然一个sheet可以调用的方法有:

     sheet.activate       sheet.charts         sheet.index
     sheet.api            sheet.clear          sheet.name
     sheet.autofit        sheet.clear_contents sheet.names
     sheet.book           sheet.delete         sheet.pictures
     sheet.cells          sheet.impl           sheet.range
    ...等等

      其中activate,autofit,cliear_content等这些方法都还挺有意思的。最为核心的方法应该就是range了,通过它可以获取到具体的某一段范围的数据。

      例如sheet.range('A1')获取到A1单元格的对象,通过调取此对象的value属性,就可以读取/改变单元格的值,并且这一切都不会影响单元格本身的格式。

      更加imba的一种做法是sheet.range('A1:C3')这样的形式可以一次性获取到一个区域内所有单元格的对象。调取其value对象的话得到的也是一个二维列表形式的数据集合,可以形象方便地把Excel中的数据映射到python中来。对于设置数据时,传入数据可以是一个不符合指出区域规定的结构,但是这样结果会比较微妙。。建议实验

      需要指出的是和xlrd一样,读取value时合并单元格只在其左上角的子单元格中有值,其余的和未填写的单元格一样,都是None。

    ■  对于range,能做的还有更多

      除了简单的调用value和为value赋值来读写Excel外,还有如下接口可以使用

     range.add_hyperlink  range.clear_contents range.count
     range.address        range.color          range.current_region
     range.api            range.column         range.end
     range.autofit        range.column_width   range.expand
     range.clear          range.columns        range.formula
    ...等等

      一些接口的用法提示:

      range.add_hyperlink('https://www.baidu.com','百度')

           range.color = (128,128,128)    RGB通道颜色,可获取or设置

      range.row/column  获取第几行/列,注意是第几而不是下标

      range.formula  可以设置计算表达式,用来进行表内计算

      range.current_region  返回当前range所在区域的区域表达,这个比较难描述,好比一个Excel中互相连接的单元格都是连城一片,两个片之间没有任何相邻就是互相独立的。

      range.count  返回这个range中共有多少单元格,合并单元格仍然按未合并的算

      range.offset(a,b)  获取到当前range向右a格,向下移动b格同样大小的那片区域,ab可以为负值

      range.rows/columns  返回行/列的各个range对象

      

    ■  关于App

      其实App还没有仔细研究过,简单来说,当通过xw.Book创建一个实例的时候,默认向xw.apps中添加一个App实例,而book就属于这个App。

      如上面所说,解决Excel程序无法关闭的问题可以用这个app实例的kill方法。app.kill()可以把Excel程序连同文件一并关闭。另外,如果不想让Excel程序跳出来则可以置app.visible=False,即时设置即时生效。

      由于通常我们的操作基于Book类对象,当完成操作book.save之后,如果想要关掉Excel,可以调用book.app.kill()或者book.app.quit(),但在这之前不要book.close(),否则会报错哦。(推荐使用quit,使用kill的话有些excel打开软件比如WPS会记录下非正常的退出状态,当再次打开这个文档的时候就会报错说有错误。如果第二次仍然使用xlwings打开,而错误提示的对话框占据了焦点,会使得xlwings无法正常使用)。

      

  • 相关阅读:
    grunt in webstorm
    10+ Best Responsive HTML5 AngularJS Templates
    响应式布局
    responsive grid
    responsive layout
    js event bubble and capturing
    Understanding Service Types
    To add private variable to this Javascript literal object
    Centering HTML elements larger than their parents
    java5 新特性
  • 原文地址:https://www.cnblogs.com/franknihao/p/8514634.html
Copyright © 2011-2022 走看看