Excel Python:飞速搞定数据分析与处理

第四部分 使用 xlwings 对 Excel 应用程序进行编程
第十一章 Python 包跟踪器
本章会构建一个典型的商业应用程序 ,它可以从互联网上下载数据并存储到数据库 中,然 后再将数据在 Excel 中进行可视化 。在此过程中你会认识到 xlwings 在这样的应用程序开发过程中扮演着怎样的角色,也能看到将 Python 连接至外部系统有多容易。在尝试构建一个十分接近真实情况且简单易懂的项目的过程中,我想到了 Python 包追踪器 。这个 Excel 工具可以显示某个 Python 包每年发布的次数。虽然这只是一个案例研究,但是实际上你可能会发现这个工具可以用来了解一个 Python 包是否处于积极开发的状态。
在对这个应用程序有了一个大致的了解后,为了能够理解它的代码,首先需要研究如下问题:如何才能从互联网上下载数据以及如何与数据库交互。然后再学习 Python 中的异常处理。当我们涉足应用程序开发时,异常处理是一个很重要的概念。学完这些基础知识之 后,我们会研究 Python 包追踪器的各个组件,了解它们是如何相互协作的。本章在最后会研究如何调试 xlwings 代码。和前两章一样,本章也需要在 Windows 或 macOS 中安装 Microsoft Excel。首先来试用一下 Python 包追踪器。
11.1 构建什么样的应用程序
进入配套代码库,能找到 packagetracker 文件夹。文件夹中有几个文件,不过现在只需要打开叫作 packagetracker.xlsm 的 Excel 文件,然后进入 Database 工作表:首先需要往数据库中填充一些数据,这样才有事可做。如下图所示,填写一个包名,比如 "xlwings",然后点击 Add Package(添加包)。你可以选择 Python Package Index(PyPI)上的任意一个包名。

!敲重点 !:报错处理
想要成功添加 xlwings,真的废了九牛二虎之力(感谢 GPT 耐心陪笔者处理完所有报错)。如下图

接下来,博主带着大家一步步来解决遇到的问题。先抛出一个根本原因:该书使用的多种 Python 库已经过时了,因此很多配套代码库的 .py 文件代码里的相关参数已经不适用了。
第一,我们需要在 Excel 文件的 xlwings 中输入 packagetracker.xlsm 这个文件的同名 python 文件的所在目录,如下图:

此时,我们点击 Run main 按钮来验证是否能够调用 packagetracker.py 中的函数,就会出现第一个报错:
Error
Traceback (most recent call last): File "<string>", line 1, in <module> AttributeError: module 'packagetracker' has no attribute 'main'
Press Ctrl+C to copy this message to the clipboard.
这个错误的意思是说:在 packagetracker.py 里没有 main 函数,因此无法进行调用。那就让我们打开这个 python 文件来看一看:

滚动到最底行可以看到,确实写了一个 main 函数的调用,但是往上查找会发现根本没有 def main(): 这个函数定义。所以解决方法也很简单,就是我们自己在前面添加两行代码:
def main():
add_package()

添加后保存关闭,再次来到 Excel 文件中执行 xlwings 的 Run main 就可以正常运行了。
第二 ,我们在 Excel 文件的 Package name 输入 xlwings 后,点击 Add Package,稍等几秒会在输入框的右边显示一个报错 "TypeError("Connection.execute() got an unexpected keyword argument 'package_name'")",笔者表示很是苦恼。但是这个错误的原因来自另一个 Python 文件 database.py。
GPT 是这样解释的:database.py 里用了旧版 SQLAlchemy 写法。即老版 SQLAlchemy 1.x 代码,而现在我们安装的是 SQLAlchemy 2.x,该版本已经废弃这种写法。
在旧写法中为:conn.execute(sql, package_name=package_name),而新版本中写成:conn.execute(sql, {"package_name": package_name})。所以,打开 database.py 进行以下几处代码的修改:
43 con.execute(text("INSERT INTO packages (package_name) VALUES (:package_name)"),
44 {"package_name": package_name})
76 con.execute(text("DELETE FROM package_versions"))
77 con.commit()
105 con.execute(text(sql))
106 con.commit()



修改后保存退出,回到 Excel 中再次输入 xlwings,即可添加成功。
此时我们可以在 Update Database 下面看到最后更新的时间戳,以及在 Log(日志)部分看到表示已经成功下载了 xlwings 的数据并将其保存到了数据库的消息(在大家先前没有报错的情况下可以运行成功,见下图。如果先前报错了,可以私信博主,这里就不再赘述:关闭 Excel 文件,来到同目录下,删除 packagetracker.db 文件,在该窗口下打开终端,使用命令 python database.py,重新打开 Excel,然后 Run main,点击 Add Package,就可以正常显示日志了)。

重复上述步骤,添加 pandas 包,这样就有更多的数据可以进行测试了。现在切换到 Tracker(跟踪器)工作表,然后在 B5 单元格的下拉菜单中选择 xlwings,再点击 Show History(显示历史)。就会报错了:

此时,这个问题和前面的 SQLAlchemy 无关了。现在是:matplotlib 新版本不再支持:plt.style.use("seaborn"),因为:新版 matplotlib 已经把 seaborn 样式从内置样式里移除了。所以报错为:OSError: 'seaborn' is not a valid package style。
修复:打开 packagetracker.py,找到 plt.style.use("seaborn"),改成 plt.style.use("seaborn-v0_8")

保存后退出,再次点击 Show History,你的画面看起来应该类似于下图,其中显示了该包最新的发布版本,以及一张包含了全年发布次数的统计图。


现在你可以返回 Database 工作表并添加额外的包。每当你想要从 PyPI 获取最新信息来更新数据库时,只需点击Update Database(更新数据库)按钮:应用程序会利用 PyPI 上的最新数据同步数据库。