zoukankan      html  css  js  c++  java
  • Python-Excel-xlwings

    选取Python的写Excel的包,网上介绍不少,很多推荐xlwings的包。自己用了感觉还可以,满足了自己的需求,就是还是有些小坑的。

    基础结构

    一个app与一个Excel实例对应;一个book对应一个工作簿;一个工作簿有多个sheet;
    结构

    官方注解:

    在Mac系统里, 虽然xlwings允许多个Excel同时运行,但这不是Mac版的Excel官方支持的功能:不像在Windows系统里,当文件已经在另外一个Excel实例中打开的时候,不会要求你打开一个只读版本。就是说你得自己小心注意,避免同样的文件被不同的Excel实例重写。

    在编写程序的时候 不要让一个excel文件,被多个实例app打开,这样的在可能导致数据异常。例如,没有保存成功。

    快速使用

    简单介绍xlwings的入门使用,文件操作分为以下几种场景,主要注意 异常场景的保护,详细可以参照官方文档。

    打开已保存的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'test.xlsx'
    wb=app.books.open(filepath)
    wb.save()
    wb.close()
    app.quit()
    #另外一种方式,其他方式可以参照官方API
    wb=xw.Book("test.xlsx")
    wb.save()
    

    新建Excel文档

    import xlwings as xw
    app=xw.App(visible=True,add_book=False)
    wb=app.books.add()
    wb.save(r'test.xlsx')
    wb.close()
    app.quit()
    

    打开test文档,若存在打开,若不存在新建文档

    app=xw.App(visible=True,add_book=False)
    app.display_alerts=False
    app.screen_updating=False
    # 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
    filepath=r'test.xlsx'
    try:
        wb=app.books.open(filepath)
    except Exception as e:
        print(e)
        wb=app.books.add()
        wb.save(r'test.xlsx')
    wb.sheets['sheet1'].range('A1').value='人生海海'
    wb.save()
    wb.close()
    app.quit()
    

    异常情况

    描述

    1. 文件正常打开了,也执行保存了。但是发现内容并有没有保存成功,甚至文件有时候还打不开。
    2. 程序崩溃

    解决方案

    之前程序异常退出,会导致文件句柄没有释放,会导致前面的情况发生。让后面的程序能够正常执行,可以执行如下临时代码:

    # 结合“基础结构”这一节,可以理解程序的作用,就是让实例能够正常退出
    print(xw.apps)
    for app in xw.apps:
        app.quit()
    

    完整解决方案是,一定要保证程序正常退出。

    try:
        #操作过程
        pass
    except Exception as e:
        wb.save()
        wb.close()
        app.quit()
        # raise e
    
  • 相关阅读:
    ConcurrentHashMap总结
    HashMap在多线程环境下操作可能会导致程序死循环
    oracle数据库的 to char 和to date 区别(时间格式化)
    SQL中的cast()函数用法
    常见的垃圾收集器有3类-java面试一
    mybatis中sql引用
    mysql find_in_set 查询
    用Redis实现微博关注关系的分析
    C#与C++相比较之STL篇(续一)
    Vite2.0 入门
  • 原文地址:https://www.cnblogs.com/meiguhuaxian/p/13061447.html
Copyright © 2011-2022 走看看