前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『新认知』原来python也可以完整地调用VBA的功能驱动OFFICE自动化

『新认知』原来python也可以完整地调用VBA的功能驱动OFFICE自动化

作者头像
Excel催化剂
发布2024-06-17 17:58:43
820
发布2024-06-17 17:58:43
举报
文章被收录于专栏:Excel催化剂Excel催化剂

之前我一直以为,python对OFFICE的自动化,相较VBA的话,是有限的,就像openpyxl那样,需要有人去不断地追加维护才行。

经过学习后,发现其实只要使用win32com这个库,就可以将VBA的代码直接移植到python上使用。功能上是和当前VBA的宿主相关,例如Excel版本越高,VBA的功能越多,相应的win32com这个库也可以自动增加这些功能,本质上win32com只是一个桥梁,使用python可以驱动COM组件,COM组件暴露多少功能,它就能实现多少。

不过按童大谦老师的【代替VBA!用python轻松实现Excel编程】一书里说的,极个别接口还是有些异常的。

我专门测试了一下,拿Excel比较新的接口如PowerQuery。实测还是正常可以获取的,代码如下(xlwings本质底层用的是win32com):

所以,如果python自动化的是COM组件,应该使用win32com,更科学。而不是使用pythonnet,后者是对.NET的非托管的dll起作用。如果硬着来,效果比较差,例如以下的代码,需要使用反映的方式才能操作COM组件。

那有哪些软件是COM组件暴露,哪些不是?这个可以用一段小命令,调出一个COM浏览器,不过更快的应该直接问GPT4,哈哈。

代码语言:javascript
复制
from win32com.client import combrowse
combrowse.main()

因为我本机是OFFICE365,所以这里就直接获取到最新COM组件Excel16。

当然如果要使用C#来实现这些新的接口,如果没有引用Excel16的dll,就没有智能提示,只能用动态类型来处理,也一样可以的。

代码语言:javascript
复制
        static void Main(string[] args)
        {
            Excel.Application app = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
            dynamic wkb = app.ActiveWorkbook;
            Console.WriteLine(wkb.Queries.Item[1].Name);
        }

除了OFFICE软件,笔者用到的还有sqlserver的对象模型自动化,它有两个模型SMO和AMO。其中SMO可能比较旧的技术,还是COM组件的,但AMO分析模型,就已经变成是.NET的托管模型了。

代码语言:javascript
复制
import win32com.client

# 创建 SQL Server 对象
smo = win32com.client.Dispatch('Microsoft.SqlServer.Management.Smo.Server')

# 连接到 SQL Server 实例
server = smo('localhost')  # 替换为你的服务器名称

# 获取数据库列表
databases = server.Databases
for db in databases:
    print(f'Database Name: {db.Name}')

所以后者需要用pythonnet的方案了。

代码语言:javascript
复制
import clr
from System import String
from System.Reflection import BindingFlags

# 添加对 Microsoft.AnalysisServices.Tabular 的引用
dll_path = r'C:\Path\To\Your\Microsoft.AnalysisServices.Tabular.dll'
clr.AddReference(dll_path)

# 导入 Microsoft.AnalysisServices.Tabular 命名空间
from Microsoft.AnalysisServices.Tabular import Server, Database

# 创建并连接到 Analysis Services 服务器实例
server = Server()
server.Connect('localhost')  # 替换为你的服务器地址

# 获取数据库对象
database = server.Databases['YourDatabaseName']  # 替换为你的数据库名称

# 打印数据库信息
print(f'Database Name: {database.Name}')
print(f'Database Compatibility Level: {database.CompatibilityLevel}')

# 列出所有表
for table in database.Model.Tables:
    print(f'Table: {table.Name}')
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档