xlwings Excel 文档处理最优解

449 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

结论

  • 优先选择 xlwings 库。
    • 直接复制一整张工作表很完美。不像 openpyxl 存在一些特殊格式不能复制过去的情况(如公式 + 颜色 + 下拉列表)。
    • xls/xlsx 格式 Excel 文档均支持,但注意:office excel文档支持ok,wps excel 文档存在不支持情况!(太欺负国软了,气人)
  • 源码、素材文档,参见gitee

excel库比对

在此借用一张网络上知乎Python小二水印带图片,如有侵权请告知,立马删 在这里插入图片描述

pycharm 导入库

在这里插入图片描述

源码

import xlwings as xw

def readWrite_xlwings():
    # 注意:wps保存的文件可能存在无法打开问题!
    # visible=None: excel实例是否可见
    # add_book=True: 是否打开新的Excel程序,是否打开新的excel窗口)
    app = xw.App(visible=True, add_book=False)
    # 关闭屏幕更新,可加快宏的执行速度,但看不到Excel数据变化过程
    # app.screen_updating = False

    wb = app.books.open(r"D:\cuncaojin\Desktop\feng\表格.xls")
    ws0 = wb.sheets["总表"]
    ws = wb.sheets['分表']
    print(ws.range('A1').value)

    # 行数、列数正确值
    rng = ws0.range('A1').expand('table')
    nrows = rng.rows.count
    ncols = rng.columns.count
    print(str(nrows) + ", " + str(ncols))

    for i in range(2, nrows + 1):
        # 编号
        number = ws0.range(i, 1).value
        print(number)
        # 以编号名作为新工作表名
        copy_sheet = ws.copy(name=str(number))
        # ws0表i行数据给新表赋值
        copy_sheet['B2'].value = ws0.range(i, 2).value
        copy_sheet['B4'].value = ws0.range(i, 1).value
        copy_sheet['B6'].value = ws0.range(i, 6).value
        copy_sheet['B7'].value = ws0.range(i, 8).value
        copy_sheet['B10'].value = ws0.range(i, 9).value
        copy_sheet['B11'].value = ws0.range(i, 10).value
        copy_sheet['D6'].value = ws0.range(i, 7).value
        copy_sheet['D7'].value = ws0.range(i, 11).value

    wb.save()
    # 关闭最后第一个打开的excel文件
    wb.close()
    # 退出excel程序,
    app.quit()
    # # 通过杀掉进程强制Excel app退出
    # # app.kill()

if __name__ == '__main__':
    readWrite_xlwings()

参考

  1. xlwings最全操作;10秒搞定Xlwings全套操作
  2. openpyxl