ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5162|回复: 17

[原创] [ Excel-Python ] -9:让 Excel 起飞的超强 Python 库:xlwings

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-6-20 15:28 | 显示全部楼层 |阅读模式
让 Excel 起飞的超强 Python 库:xlwings


0. 引子

又在高铁上了,不能总是发高铁的照片,发一张中国空间站的吧,向中国航天致敬!

image.jpg

高铁上,一个长达5个半小时的旅程。可以认真想想写什么了。
毕竟内容太多,是进入一个新的话题,还是继续细化上一帖的问题与细节?

关于 Excel - Python 的话题,希望写哪些内容,或者有什么好的思路,请各位学友,随时提出您的建议,就此谢过!

这次,还是不拘泥细节,开一个新的知识点:xlwings


1. xlwings - Make Excel Fly!

xlwings - Make Excel Fly! 这句话是 xlwing 官方文档的第一句话。官网文档地址:https://docs.xlwings.org/en/stable/

我们上一帖已经讲了 Pandas,知道 Pandas 是一个强大的数据分析处理库,其中的 read_excel() 和 to_excel() 方法可以将 Excel 文件的内容读到 DataFrame 中,或者写回去。
而数据一旦在 DataFrame 中,我们就可以随便玩儿了,各种处理,得到想要的结果。

很灵活,但是,DataFrame 本质上和 Excel 文件是没有关系的。数据读过来以后,就和当初那个 Excel 没关系了。直到你写回当初那个 Excel 文件。

我们可不可以通过 Python 代码,直接随时处理 Excel 中的数据呢?
我们先来试一把:

请先直接在电脑中打开一个现成的 Excel 文件,那就还是我们的 orders2.xlsx 吧。如下:

db729081d99be32397d80bce5493bf5.png

然后,在 Jupyter 中输入如下代码:

  1. import xlwings as xw
  2. xw.Range('C2').value = 888
复制代码


瞬间,这个 Excel 文件中的 圆珠笔 数量 由100 变为 888 了。 惊奇不惊奇?!
我们没做别的,没有用前面帖子中的代码。就只是上面的两句代码,其实应该说,就第二行这一行代码。


image.jpg

这就是 xlwings ! 让 Excel 起飞的 Python 库。


2. xlwings 的基本概念

上面的代码太奇妙了,我们甚至都没有说是哪个文件。事实上,我们是需要指出是哪个文件的,如果不具体指出,那就是当前打开的 Excel 的当前 Sheet。

我们来看一段完整的代码:

  1. import xlwings as xw

  2. app=xw.App(visible=True,add_book=False)
  3. wb = app.books.open('d:/demo/orders2.xlsx')
  4. sh1 = wb.sheets['订单']

  5. sh1.range('C2').value = 999

  6. wb.save()
  7. wb.close()
  8. app.quit()
复制代码

在 Jupyter 中的截图如下:

image.png

在图中第2个 Cell 中:
第1行:App 就是指的 Excel 应用软件。即 用 xlwings 打开 Excel,Excel 应用程序窗口可见,不新建工作簿。如果写成 visible=False,则看不见 Excel 软件,它在后台直接偷偷把事儿干完。
第2行:在打开的 Excel 软件中,打开文件 oders.xlsx。
第3行:指向 sheet 订单

第3个 Cell 中的代码:将这个 sheet 的 C2单元格的值 设为999.

第4个 Cell:
第1行:保存该工作簿。如果您按我的步骤一步步操作的话,前面最开始的设置888的例子,你关闭这个Excel时,他问你存不存。因为没有用代码直接去存
第2行:关闭该工作簿。就是关闭 orders2.xlsx文件。
第3行:退出 Excel 应用。就是把 Excel 软件给叉叉了。

这样看的话,是不是又觉得比直接用 Pandas 代码多了?
其实本质是:第2个Cell 中和第4个Cell中的代码,只是在开头和结尾用,而第3个Cell,才是核心,在这里,你可以玩儿各种骚操作。

什么是 Cell ?
Cell 是 Jupyter 中写 Python 代码的格子。


什么是 Jupyter?  
Jupyter 是一个非常方便的 Python 开发环境。
可以看此前的帖子:“[ Excel-Python ] -3:准备一个写 Python 的环境”  http://club.excelhome.net/thread-1587550-1-1.html


如何成为 Jupyter 高手?
最好的方法,是看我的书哦。


3. xlwings 应用举例

下面,我们给出几个使用 xlwings 的例子:

1)批量新建 Excel 工作簿:
  1. import xlwings as xw

  2. app = xw.App(visible=False, add_book=False)

  3. for i in range(10):
  4.     wb = app.books.add()
  5.     wb.save(f'd://demo//NewTest{i}.xlsx')
  6.     wb.close()
  7.    
  8. app.quit()
复制代码


以上代码,在文件夹 d:\demo\下,新建了10个Excel文件,文件名为 NewTest0.xlsx 到 NewTest9.xlsx

2)批量新建 sheet :
  1. import xlwings as xw

  2. app=xw.App(visible=False,add_book=False)
  3. wb = app.books.open('d:/demo/NewTest1.xlsx')

  4. for j in range(1,13):
  5.     sh=wb.sheets.add(str(j)+'月绩效')
  6.    
  7. wb.save()
  8. wb.close()
  9. app.quit()
复制代码
以上代码,在文件 NewTest1.xlsx 中,新建了12个月的绩效sheet。

3)合并单元格:
  1. sheet.range('A1:C2').merge()
复制代码
以上代码,将单元格A1到C2合并

4) 设置字体、字号、颜色
  1. sh.range('A1').api.Font.Size = 16  
  2. sh.range('A1').api.Font.Bold = True
  3. sh.range('A1').api.HorizontalAlignment = -4108
  4. sh.range('A1').color=(0,128,0)
复制代码
以上代码,设置字号为16,粗体,居中,绿色。
其中,HorizontalAlignment :  -4108 水平居中。 -4131 靠左,-4152 靠右。

5) 插入公式
  1. sh.range('C9').formula = '=SUM(C6:C8)'
复制代码
此行代码将公式插入C9中。



6)批量举例


好了,我们把上述代码规整一下,创建公司各员工的绩效表:
image.jpg

这个例子,创建了100个文件 员工x绩效表.xlsx,每个文件中包括12个月的sheet,内部写好了公式。效果如下:

image.jpg


4. 然后

然后,我们会继续。可能是新的功能强大的内容展示,也可能是对此前不求甚解的知识的梳理细化。
也请大家提出继续怎么走的建设性意见。
谢谢

—— HiFrank   我跑,故我在


<<<  上一篇:
[ Excel-Python ] -8:用 Python 处理 Excel 中的行、列、单元格
http://club.excelhome.net/thread-1589109-1-1.html










评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-21 04:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢 心电感应 的支持与帮助,我们共同努力提高帖子的质量。
大家一起加油!

TA的精华主题

TA的得分主题

发表于 2021-6-21 13:26 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-21 14:21 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-21 15:10 | 显示全部楼层
上述最后一个案例的总代码,需要做一个小的改进:
第7行的   wb.save(f'd://demo//员工{i}绩效表.xlsx')   不要了,直接放到第34行去。
这样只在最后save一次,可以提高性能。

此前的代码是用前面的各个案例规整起来的,没注意到。

.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-6-22 14:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留名收藏,

TA的精华主题

TA的得分主题

发表于 2021-6-24 15:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-24 21:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-24 21:16 | 显示全部楼层
各位学友:
到目前为止,我们已经基本展示了用 Python 在处理 Excel 方面的强大功能。
但有很多细节需要逐一展开,后续的内容,可能不如前面的内容震撼,但却是必须的。

我会持续更新,把相关内容逐步梳理并展现给大家。
但由于工作太忙,我调整了一下规划,以后每周更新一贴。
还请大家监督。

也欢迎大家随时提出您的好的建议和意见。
谢谢!

—— HiFrank  我跑,故我在

TA的精华主题

TA的得分主题

发表于 2021-6-24 22:55 来自手机 | 显示全部楼层
Hi-Frank 发表于 2021-6-24 21:16
各位学友:
到目前为止,我们已经基本展示了用 Python 在处理 Excel 方面的强大功能。
但有很多细节需要 ...

期待楼主更新
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-3 07:50 , Processed in 0.063765 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表