Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

2023-11-01

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:小白零基础《Python入门到精通》

在这里插入图片描述

xlwings 是用来「处理Excel」的Python第三方库,开源免费,一直在更新。

使用前需要「下载」、安装 xlwings 模块

【File】-【Settings】-【Progect:xxx】-【Python Interpreter】

在这里插入图片描述

然后「导入模块」,as是别名,方便后续调用

import xlwings as xw

xlwings

  • App:表示Excel程序
  • Book:表示工作簿
  • Sheet:表示工作表
  • Range:表示单元格

1、快速入门

import xlwings as xw

# 1、打开Excel程序,处理过程可观
with xw.App(visible=True) as app:
    # 2、选择使用的工作簿
    book = app.books[0]
    # 3、选择使用的工作表
    sheet = book.sheets[0]
    # 4、选择单元格范围,设置背景颜色
    sheet.range('A1').color = '#ff0000'
    # 向单元格写入数据
    sheet.range('A2').value = 'hello Excel'
    # 5、保存工作簿
    book.save('myExcel.xlsx')

预期:文件保存到当前目录,打开后看到我们写入的内容。


1、打开Excel

使用 App() 打开Excel程序,一个App对应一个Excel实例。

为了防止僵尸进程,建议这样「启动」Excel( with 搭建上下文,会「自动释放」资源,无需手动close)

import xlwings as xw

with xw.App(visible=True) as app:
    print(app)

输出:

<App [excel] 5276>

提示:

  • 桌面下方的任务栏会有Excel的程序一闪而过,这是因为 with 会自动关闭Excel;
  • 如果 visible=False,则任务栏看不到变化(程序不可见);
  • 如果直接用 xw.App() 的方式打开Excel,则会在桌面打开Excel,并且不会关闭。
  • app.activate():活动Excel,将Excel程序放到桌面最前方。focus=True表示将鼠标焦点移动到Excel。

实例

import xlwings as xw

with xw.App(visible=True) as app:
    app.activate(True)

预期:Excel显示在桌面最前方(一闪而过)。


2、创建工作簿

在Excel中,「新建」一个工作簿,并返回工作簿对象Book,有三种创建方式:

  • xw.Book()
  • xw.books.add()
  • app.books.add()

实例

import xlwings as xw

with xw.App(visible=True) as app:
    print('自带一个工作簿:', app.books[0])
    book2 = xw.Book()
    print(book2)
    book3 = xw.books.add()
    print(book3)
    book4 = app.books.add()
    print(book4)
    print(app.books)

输出:

自带一个工作簿: <Book [工作簿1]>
<Book [工作簿2]>
<Book [工作簿3]>
<Book [工作簿4]>
Books([<Book [工作簿1]>, <Book [工作簿2]>, <Book [工作簿3]>, ...])

2.1、使用工作簿

1)「使用」指定的工作簿,根据工作簿的名字/索引/序号,并返回工作簿对象,有五种方式。
注意:() 根据 序号 选择,从1开始;[]根据 索引 选择,从0开始。

  • app.books (序号)
  • app.books [索引]
  • xw.books [索引]
  • xw.books (序号)
  • xw.Book (名字)

实例

import xlwings as xw

with xw.App(visible=True) as app:
    print(app.books)
    print(app.books(1))
    print(app.books[0])
    print(xw.books[0])
    print(xw.books(1))
    print(xw.Book('工作簿1'))

输出:

Books([<Book [工作簿1]>])
<Book [工作簿1]>
<Book [工作簿1]>
<Book [工作簿1]>
<Book [工作簿1]>
<Book [工作簿1]>

2)使用指定的工作簿,根据「文件路径」(用r字符串包裹路径),有三种方式

  • xw.Book( 路径 )
  • xw.books.open( 路径 )
  • app.books.open( 路径 )

实例

import xlwings as xw

with xw.App(visible=True) as app:
    print(xw.Book(r'E:\test.xlsx'))
    print(xw.books.open(r'E:\test.xlsx'))
    print(app.books.open(r'E:\test.xlsx'))
    print(app.books)

输出:

<Book [test.xlsx]>
<Book [test.xlsx]>
<Book [test.xlsx]>
Books([<Book [工作簿1]>, <Book [test.xlsx]>])

2.2、操作工作簿

  • book.name:返回工作簿的名字
  • book.sheets:返回工作簿的所有sheet页(列表)
  • book.app:返回工作簿所在的App对象(Excel程序)

实例

import xlwings as xw

with xw.App(visible=True) as app:
    book = app.books[0]
    print(book.name)
    print(book.sheets)
    print(book.app, app)
    print(book.selection)

输出:

工作簿1
Sheets([<Sheet [工作簿1]Sheet1>])
<App [excel] 18392> <App [excel] 18392>
<Range [工作簿1]Sheet1!$A$1>

  • book.save():保存工作簿,如果不指定路径,则保存到当前路径。

语法

book.save( path, password )

参数

  • path :(可选)文件保存路径
  • password :(可选)文件打开密码

实例

import xlwings as xw

with xw.App(visible=True) as app:
    book = app.books[0]
    book.save(r'E:/test1.xlsx', 123456)

预期:文件保存到E盘,打开需要「输入密码」


  • book.to_pdf():导出PDF,如果不指定路径,则保存到当前路径。

注意:Excel必须有「内容」,才能导出PDF,否则会报错

语法

book.to_pdf( path, include, exclude, show )

参数

  • path :(可选)PDF文件保存路径,默认当前目录
  • include :(可选)包含哪些工作表,单个工作表名 或 多个工作表名的列表
  • exclude :(可选)不包含哪些工作表,单个工作表名 或 多个工作表名的列表
  • show :(可选)创建后使用默认应用打开PDF,默认值False

实例

import xlwings as xw

with xw.App(visible=True) as app:
    book = app.books[0]
    book.sheets[0]['A1'].value = 'text'
    book.to_pdf(show=True)

预期:PDF文件保存到当前目录下,并「自动打开」


3、创建工作表

使用工作簿对象 Book 「创建」工作表,返回工作表对象 Sheet ,一个 Sheet 对应一个工作表,有两种创建方式:

  • app.books[0].sheets.add()
  • xw.books[0].sheets.add()

创建工作表时,可以「设置表名」。参数2中, after 表示插入到某个表后面, before 表示插入到某个表前面。

  • app.books[0].sheets.add('name1')
  • xw.books[0].sheets.add('name2')

实例

import xlwings as xw

with xw.App(visible=True) as app:
    app.books[0].sheets.add('name1')
    xw.books[0].sheets.add()

    print('所有工作表:', app.books[0].sheets)

输出:

所有工作表: Sheets([<Sheet [工作簿1]Sheet3>, <Sheet [工作簿1]name1>, <Sheet [工作簿1]Sheet1>])

3.1、使用工作表

通过工作簿对象 Book 「使用」指定的工作表,根据工作表的名字/索引/序号,并返回工作表对象 Sheet ,有六种方式:

  • app.books[0].sheets[0]
  • app.books[0].sheets(1)
  • app.books[0].sheets['Sheet1']
  • xw.books[0].sheets[0]
  • xw.books[0].sheets(1)
  • xw.books[0].sheets['Sheet1']

注意:() 根据 序号 选择,从1开始;[]根据 索引 选择,从0开始。

实例

import xlwings as xw

with xw.App(visible=True) as app:
    book = app.books[0]
    print(book.sheets[0])
    print(book.sheets(1))
    print(book.sheets['Sheet1'])

    wb = xw.books[0]
    print(wb.sheets[0])
    print(wb.sheets(1))
    print(wb.sheets['Sheet1'])

    print('工作表列表:', book.sheets)

输出:

<Sheet [工作簿1]Sheet1>
<Sheet [工作簿1]Sheet1>
<Sheet [工作簿1]Sheet1>
<Sheet [工作簿1]Sheet1>
<Sheet [工作簿1]Sheet1>
<Sheet [工作簿1]Sheet1>
工作表列表: Sheets([<Sheet [工作簿1]Sheet1>])

3.2、操作工作表

1)工作表名

  • app.books[0].sheets[0].name = 'sheetName':设置工作表名
  • app.books[0].sheets[0].name:获取工作表名
  • app.books[0].sheets[0].book:获取工作表所属的工作簿
  • app.books[0].sheets[0].index:获取工作表的索引(从1开始)

2)行高列宽

  • app.books[0].sheets[0].autofit():自适应行高列宽
  • app.books[0].sheets[0].autofit(axis='rows'):自适应行高
  • app.books[0].sheets[0].autofit(axis='columns'):自适应列宽

3)导出工作表(不指定路径,默认保存到当前目录)

  • app.books[0].sheets[0].to_html():导出 HTML
  • app.books[0].sheets[0].to_pdf():导出 PDF(内容不能为空)

4)复制工作表

  • app.books[0].sheets('sheetName').copy():复制工作表为副本
  • name:(可选,str)副本的名字
  • before:(可选,sheet对象)复制到哪个工作表之前
  • after:(可选,sheet对象)复制到哪个工作表之后

3.3、删除工作表

  • app.books[0].sheets[0].clear_contents():删除文本但保留样式
  • app.books[0].sheets[0].clear_formats():删除样式但保留文本
  • app.books[0].sheets[0].clear():删除文本和样式
  • app.books[0].sheets[0].delete():删除工作表

4、读写单元格

单元格不需要创建,选中单元格「范围」,然后读写即可,一个 Range 对应一个单元格。

4.1、选择单元格

按照范围、位置,选择单元格,并返回单元格对象,有多种方式。

1)按照A1表示法(例:选中A1到B3范围的单元格)

  • sheet.range('A1')
  • sheet.range('A1:B2')

2)按照坐标位置,坐标从左上角起始

  • sheet.range(1, 1)
  • sheet.range((1, 1), (3, 4))

3)切片方式选择范围

  • sheet['A1']
  • sheet['A1:B2']
  • sheet[0, 0]
  • sheet[0:1, 0:4]

4)按照单元格名字

  • sheet.range('a1_name')

实例

import xlwings as xw

with xw.App(visible=True) as app:
    book = app.books[0]
    sheet = book.sheets[0]
    range1 = sheet.range('A1')
    print(range1)
    range2 = sheet.range('A1:B2')
    print(range2)
    range3 = sheet.range(1, 1)
    print(range3)
    range4 = sheet.range((1, 1), (3, 4))
    print(range4)
    print(sheet['A1'])
    print(sheet['A1:B2'])
    print(sheet[0, 0])
    print(sheet[0:1, 0:4])

输出:

<Range [工作簿1]Sheet1!$A$1>
<Range [工作簿1]Sheet1!$A$1:$B$2>
<Range [工作簿1]Sheet1!$A$1>
<Range [工作簿1]Sheet1!$A$1:$D$3>
<Range [工作簿1]Sheet1!$A$1>
<Range [工作簿1]Sheet1!$A$1:$B$2>
<Range [工作簿1]Sheet1!$A$1>
<Range [工作簿1]Sheet1!$A$1:$D$1>

4.2、写入数据到单元格

向指定单元格中写入数据,数据可以是单个值一维列表二维列表

  • sheet.range('A1').value = 'hello Excel'
  • sheet.range('A2').value = [1, 2, 3]
  • sheet.range('A3').value = [[11, 22], [33, 44]]

写入效果参见下图

在这里插入图片描述

提示:已经有数据的单元格,再次写入,会覆盖原来的数据,常用来修改单元格数据。


4.3、读取单元格的数据

按照A1表示法,读取指定范围内单元格的数据,读出的数据可以是单个数据列表二维列表形式。

  • sheet.range('A1').value
  • sheet.range('A2:C2').value
  • sheet.range('A3:B4').value

我们将上一步写入的数据读出来,输出结果如下:

hello Excel
[1.0, 2.0, 3.0]
[[11.0, 22.0], [33.0, 44.0]]

4.4、设置单元格样式

1)背景颜色

  • sheet.range('A1:A2').color = '#FF0000':按照颜色代码设置颜色
  • sheet.range('B1').color = (255, 255, 0):按照颜色坐标设置颜色
  • sheet.range('A2').color = None:去除背景颜色
  • sheet.range('A2').color is None:判断背景颜色是否为空
  • sheet.range('B1').color:获取背景颜色

2)行高列宽

  • sheet.range('A1').row_height:获取行高
  • sheet.range('A1').column_width:获取列宽
  • sheet.range('A1').row_height = 20:设置行高
  • sheet.range('A1').column_width = 20:设置列宽
  • sheet.range('A1').rows.autofit():自适应行高
  • sheet.range('A1').columns.autofit():自适应列宽
  • sheet.range('A1').autofit():自适应行高列宽

3)合并单元格

  • sheet.range('A1:C1').merge():合并单元格
  • sheet.range('B1:C1').unmerge():取消合并
  • sheet.range('A1').merge_area:返回指定单元格的合并范围,如果没有合并,就返回单元格本身
  • sheet.range('A1').merge_cells:判断是否包含合并单元格(True包含;False不包含)

4)函数公式

  • sheet.range('D1').formula = '=SUM(A1:C1)':设置函数公式
  • sheet.range('D1').formula:获取函数公式

5)单元格名字

  • sheet.range('A1').name = 'a1_name':设置单元格名字
  • sheet.range('A1').name:获取单元格名字

6)复制粘贴

  • sheet.range('A1').copy():将单元格的内容复制到剪贴板
  • sheet.range('A2').paste():将剪贴板的内容复制到单元格

4.4、删除单元格

删除指定范围的单元格、数据、样式

  • sheet.range('A1').clear_contents():删除数据但保留样式
  • sheet.range('A2').clear_formats():删除样式但保留数据
  • sheet.range('A3').clear():删除数据和样式
  • sheet.range('A1').delete():删除单元格
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python操作Excel教程(图文教程,超详细)Python xlwings模块详解, 的相关文章

  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 最小生成树以及Kruskal算法,Prime算法

    一 最小生成树 连通图 在无向图中 若从顶点v1到顶点v2有路径 则称顶点v1与顶点v2是连通的 如果图中任 意一对顶点都是连通的 则称此图为连通图 强连通图 在有向图中 若在每一对顶点vi和vj之间都存在一条从vi到vj的路径 也存在一条
  • 信号处理中简单实用的方法——提取信号中的包络

    一 用希尔伯特变换计算信号的包络 在求某一信号包络时用得最多的是希尔伯特变换 但并不是希尔伯特变换适用于所有信号求包络的情况 这是因为对于包络没有一个很严格的定义 在求包络时不同的情况会有不同的要求 下面将介绍用希尔伯特变换求取信号的包络
  • JVM一个类的加载过程

    七大步骤 具体过程 加载 classpath jar包 网络 某个磁盘位置下的类的class二进制字节流读进来 在内存中生成一个代表这个类的 java lang Class 对象放入元空间 此阶段我们的程序员可以干预 我们可以自定义类加载器
  • java web考试题及答案_2016JAVA-WEB期末复习题库附答案.doc

    1 当访问一个Servlet时 以下Servlet中的哪个方法先被执行 D A destroy B doGet C service D init0 2 假设在myServlet应用中有一个MyServlet类 在web xml文件中对其进行
  • 【leetcode】求两个链表的交点

    求两个链表的交点 c 借助set Definition for singly linked list struct ListNode int val ListNode next ListNode int x val x next NULL
  • 静态时序分析-Multicycle约束

    有时 前端在一些关键路径上的设计 可能会出现两个时钟周期驱动和采样一拍数据 来放松关键路径上的时序 这样的设计在STA约束过程中 如果不放松 会导致Timing违例过大 无法收敛 此时的Timing由前端逻辑实现保证 STA约束即可释放 以
  • 关于VScode引用头文件时一直报错的解决方法

    一 首先看下配置文件 常见的错误原因可能是因为 c cpp properties json 这个文件并没有配置好 可以参考下列的文件 在这里插入代 configurations name Win32 includePath workspac
  • iOS开发之数据存取(三)——FMDB

    FMDB 基本使用 相比于SQLite3来说Core Data存在着诸多优势 它面向对象 开发人员不必过多的关心更多数据库操作知识 同时它基于ObjC操作 书写更加优雅等 但是它本身也存在着一定的限制 例如如果考虑到跨平台 则只能选择SQL
  • AT24C02芯片介绍

    AT24C02管脚介绍 AT24C02低功耗CMOS串行EEPROM 它是内含256 8位存储空间 具有工作电压宽 2 5 5 5V 擦写次数多 大于10000次 写入速度快 小于10ms 等特点 AT24C02的1 2 3脚是三条地址线
  • 如何使用idea来查找所有未使用的代码?

    一 目的 通过idea快速找到项目中没有被使用的代码 二 操作步骤 2 1 Code gt Analyze Code gt Run Inspection by Name 2 2 输入Unused declaration gt 查询没有被使用
  • HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException type

    个人错误记录 本人目前水平不够 所以不喜勿喷 谢谢 我的错误原因 在SSM中 使用set注入的方式注入对象导致 源码 lt Controller RequestMapping role public class RoleController
  • write和fwrite

    如果只是普通地以O RDWR的flag去open一个文件朝里write 不考虑创建 扩增 那默认内核会把文件的这个页面读进来缓存在内核里的 也即所谓的page cache 随后再发起新的write syscall写相同的页面时 只要写在pa
  • vue3中将表格导出成excel文件

    yarn add xlsx yarn add file saver 通过调用exportData方法 excel 文件 传递数据和文件名 function exportToExcel tableData filename 1 JSON 数据
  • 【FPGA】SPI协议

    1 SPI简介 SPI Serial Perripheral Interface 串行外围设备接口 是 Motorola 公司推出的一种同步串行接口技术 SPI 总线在物理上是通过接在外围设备微控制器 PICmicro 上面的微处理控制单元
  • 掌优电子为商家提供合理的移动支付解决方案

    目前官方正式对外的是微信的青蛙 和支付宝的蜻蜓 而市面上众多的刷脸支付设备 更多的是作为系统商联系对应的厂商进行生产 并非官方授权 其背后的安全性是值得考究的 从客观角度去讲的话 官方的设备 就算贵 但正规 安全 且用的放心 刷脸支付的问世
  • vue项目中实现文字滚动(跑马灯)效果——公告滚动播放

    项目需求 系统公告 要从右忘左循环播放的牛皮广告效果 实现 方案一 使用定时器和CSS3的过渡属性来实现
  • gitea无法连接mysql_Git push ERROR: Repository not found fatal:无法连接远程数据库

    用linux Debian git 上传到github 遇到的问题以及解决方案 git init git add bubble go git add bubble test go git commit m git remote add or
  • Python自学心得分享

    学习python 我首先根据自己完全代码零基础的情况下 为什么学习Python作为核心问题 进行了一个自我定位以及目标定位 我认为只要有一个目标 那么就找方法去打成目标就行了 我是完全零基础 选择学习Python主要还是因为看到大家都说Py
  • Struts2 validation.xml 正则表达式不起作用

  • Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 xlwings模块详解 1 快速入门 1 打开Excel 2 创建工作簿 2 1