美文网首页VBA For ExcelExcelpython
插上翅膀,让Excel飞起来——xlwings(一)

插上翅膀,让Excel飞起来——xlwings(一)

作者: 早起收果子 | 来源:发表于2016-12-30 20:45 被阅读20187次

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\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中。

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

  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')=[[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

参考资料:
xlwings官方文档
插上翅膀,让Excel飞起来——xlwings(二)
插上翅膀,让Excel飞起来——xlwings(三)
插上翅膀,让Excel飞起来——xlwings(四)
Excel中想实现使用Python代替VBA,请问应该怎么做?
python模块:win32com用法详解
python中使用xlrd、xlwt操作excel表格详解

相关文章

网友评论

  • 一起学分析:有没有办法设置写入时候的数值格式呢,比如像这种从数据库取出来的数据,Decimal数据写入之后会变成货币,影响数据准确定。

    data=(('18083017212600301013','二维码收款',datetime.date(2018,9,23),Decimal('0.0030')),
    ('18083017212600301013','二维码收款',datetime.date(2018,9,24),Decimal('0.0500')))
    wb2=xw.Book("F:/test.xlsx")
    sht2=wb2.sheets['sheet1']
    sht2.range("A1").value=data
    wb2.save()
    wb2.close()
    一起学分析:@BIUBIUBIU_77f7 :joy: 怎么设置呀?我最后的解决方式是对data该列的值重新处理,转换为float解决的。
    771f11fc2c6f:number_format的值可以在excel自定义查看,设置一列可以用expand('down')..number_format
    771f11fc2c6f:解决了吗:smile:
  • 东海逝波:大神,你好,我用的是python3.6,xlwings 是11.7,rng=xw.Range(1,1)会报非法参数的错,求大神指点
  • 730293bbcacf:麻烦问一下,xlwings作chart怎么设置图表标题和坐标轴标题?在文档里没看到
  • 1702566ae0f4:麻烦问一下在指定位置插入列用什么方法? 谢谢
  • 1702566ae0f4:帅哥 非常喜欢你写的关于xlwings的文章,最近正好有用到xlwings,麻烦问一下xlwings里面有在指定某一列前面插入一列的方法吗? 谢谢
  • 硅谷少年:VBA和python混合编程就指望这个了。
  • af8869e65fbd:我也是个新手,想麻烦大家问个问题。我用的是Anaconda中的spyder写的Python,昨天按照版主的介绍写了一遍没有什么问题,今天写的时候一到wb.sheets()就直接卡死,重启Anaconda也不管用,不知道各位有没有遇到类似情况的。
    东海逝波:打开任务管理器,把Excel进程结束就可以了
  • 怒撞南山:功能限制的地方可以用api调用pywin32,类似vba使用
  • 4c8d3847c800:import xlwings报错了...

    ImportError: DLL load failed: 找不到指定的模块。

    求解
    4c8d3847c800:@LuckyFrog 再问一下,为什么导入和运行的时候,感觉xlwings这个包加载比较慢呢???
    4c8d3847c800:@LuckyFrog 缺少了pywin32这个包,装了后就好了。
    早起收果子:@一个人的月光 你是怎么安装的?重新安装一下,应该就好了吧?或者你是IOS ?
  • b7986becb593:刚学Python的菜鸟想请问大佬两个问题:
    1:实现读取(A1:A10)范围内单元格的值,如果值=1,则在(B1:B10)写入2。应该怎么写?
    2:引用表格文件后就能对文件读写了吗?
    :grin:
    早起收果子:@一夫君 好的,很高兴对你能有所帮助
    b7986becb593:@LuckyFrog 谢谢细心解答:+1:,我本来是想读取(A1:A10)每个格的值然后在同一行不同列输出结果。在纠结怎么引用单元格的坐标。今天认真了你的文章后,现在知道怎么写了:stuck_out_tongue_closed_eyes:
    早起收果子:@一夫君 是A1:A10 每个单元格的值都为1,则在b1:b10写入2? 当你引用表格文件后,一直要引用到单元格,即range。 然后,就可以读写range的值,利用xw.Range('a1').value='xxx' 或者 a= xw.Range('a1').value 等
  • 8fdd692b3af9:这个里面将二维数组存储到Excel中,掉了一个. value
  • 8fdd692b3af9:我这碰到一个问题,用python调用电脑ODBC 链接时候,查询服务器数据并返回,用这个模块写入excel,报错了,不知道为什么

    #!/usr/bin/env python
    # encoding: utf-8
    # Created by Jackie at 2017/9/29
    import pyodbc
    import xlwings as xw
    import time

    def execute_odbc(sql_):
    conn = pyodbc.connect('DSN=keen')
    cursor = conn.cursor()
    cursor.execute(sql_)
    result1_filed = []
    result2_data = cursor.fetchall()
    for columns in cursor.description:
    result1_filed.append(columns[0])
    # print result1_filed
    # print result2_data
    cursor.close()
    conn.close()
    return result1_filed, result2_data


    sql = """select * from vendor_rawdata.test limit 1000"""
    field, data1 = execute_odbc(sql)

    app = xw.App(visible=True, add_book=False)
    wb = app.books.add()
    sht = wb.sheets.active

    sht[0, 0].value = field
    sht[1, 0].value = data1 # 这一步不能写入,报错了 报错了
    #以下是错误信息 pywintypes.com_error: (-2147352567, '\xb7\xa2\xc9\xfa\xd2\xe2\xcd\xe2\xa1\xa3', (0, None, None, None, 0, -2147352571), 1)


    today = time.strftime('%Y-%m-%d %H\'%M\'%S', time.localtime())
    path = path + '\\' + today + '.xlsx'
    wb.save(path)
    wb.close()
    app.quit()
    早起收果子:@Jackie_You 感觉你的都很高端,专业程序员了哦?:+1:
    8fdd692b3af9:如果用fetchone() 取一行数据,那么只能写出元组的第一个值(fetchone() 生成的元组)
    如果把这个元组用list()转换以下,转成一行列表,又可以把正行写进去

    如果用fetchall() 生成的是元组构成的列表,写进去就会报错 折腾好久了,程序应该不会设计这么傻逼,不想写循环处理
    8fdd692b3af9:贴进来缩进全出问题了啊
  • 2fc8ec95a64f:请教一下,怎么调整单元格中字体的大小和颜色?
    早起收果子:@DataAnt 还是用用win32com吧
    2fc8ec95a64f::joy: 以为找到了一个可以替代vba的包,结果功能还是不完善
    早起收果子:@DataAnt
    >>> import xlwings as xw
    >>> wb = xw.Book()
    >>> xw.Range('A1').color = (255,255,255)
    >>> xw.Range('A2').color
    (255, 255, 255)
    >>> xw.Range('A2').color = None
    >>> xw.Range('A2').color is None
    True
    range对象,有一个color属性。在我的第二篇文章中有讲。字体好像目前还没有看到怎么修改。
  • cd654ce5b4bd:想问一下 xlwings如何获取当前sheet的总行数。就是有数据的总行数总列数?
    早起收果子:@Max_1352 Range里面有个current_region属性和vba里面的CurrentRegion属性一样,你可以了解一下
  • fb12b73f17a9:不错😊

本文标题:插上翅膀,让Excel飞起来——xlwings(一)

本文链接:https://www.haomeiwen.com/subject/pebmvttx.html