详细分析Python中的win32com(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Excel
  • 3. Word

前言

对于自动化RPA比较火热,相应的库也比较多,此文分析win32com这个库,用于操作office

1. 基本知识

Win32com 是一个 Python 模块,是 pywin32 扩展的一部分,允许 Python 代码与 Windows COM(Component Object Model)对象进行交互

COM 是 Windows 平台上用于组件软件模型的技术,可以让不同的应用程序通过 COM 对象进行通信和操作

基本的API如下:

  1. Dispatch 函数用于创建一个 COM 对象的实例
    通过对象的 ProgID 来初始化 COM 对象
import win32com.client
excel = win32com.client.Dispatch("Excel.Application")
  1. GetActiveObject 函数用于连接到已经运行的 COM 对象
    通过对象的 ProgID 来连接到现有的 COM 对象实例
word = win32com.client.GetActiveObject("Word.Application")
  1. DispatchEx 类似于 Dispatch,但允许在不同的安全上下文中创建 COM 对象
excel = win32com.client.DispatchEx("Excel.Application")
  1. EnsureDispatch 函数与 Dispatch 类似,但如果无法创建对象,则会抛出更友好的异常
excel = win32com.client.gencache.EnsureDispatch("Excel.Application")
  1. WithEvents 函数用于绑定事件处理程序到 COM 对象
class ExcelEvents:def OnWorkbookOpen(self, wb):print("Workbook opened:", wb.Name)excel = win32com.client.DispatchWithEvents("Excel.Application", ExcelEvents)

2. Excel

基本的Demo如下:
展示了如何使用 win32com 控制 Excel 应用程序,创建一个新工作簿,并向单元格中写入数据

import win32com.clientdef main():# 创建 Excel 应用程序实例excel = win32com.client.Dispatch("Excel.Application")excel.Visible = True  # 使 Excel 界面可见# 创建一个新的工作簿workbook = excel.Workbooks.Add()sheet = workbook.Worksheets(1)# 向单元格中写入数据sheet.Cells(1, 1).Value = "Hello"sheet.Cells(1, 2).Value = "World"sheet.Cells(2, 1).Value = "Python"sheet.Cells(2, 2).Value = "Win32com"# 保存工作簿workbook.SaveAs(r"d:\Users\lixiaosong\ceshi.xlsx")# 关闭工作簿workbook.Close(False)  # False 表示不保存# 退出 Excel 应用程序excel.Quit()if __name__ == "__main__":main()

截图如下:

在这里插入图片描述

对于上述的Demo,基本函数用法如下:

  1. 创建 Excel 应用程序实例excel = win32com.client.Dispatch("Excel.Application")
  2. 使 Excel 界面可见excel.Visible = True
  3. 创建一个新的工作簿workbook = excel.Workbooks.Add()
  4. 选择第一个工作表sheet = workbook.Worksheets(1)
  5. 向单元格中写入数据
  6. 保存工作簿workbook.SaveAs(r"C:\path\to\your\file.xlsx")
  7. 退出 Excel 应用程序excel.Quit()

3. Word

import win32com.clientdef main():# 创建 Word 应用程序实例word = win32com.client.Dispatch("Word.Application")word.Visible = True  # 使 Word 界面可见# 创建一个新的文档doc = word.Documents.Add()# 向文档中写入文本range_obj = doc.Range(0, 0)range_obj.Text = "Hello World!\n"range_obj.InsertAfter("This is a demo of win32com in Python.\n")range_obj.InsertAfter("You can automate Word operations using Python scripts.\n")# 保存文档doc.SaveAs(r"d:\Users\lixiaosong\file.docx")# 关闭文档doc.Close(False)  # False 表示不保存# 退出 Word 应用程序word.Quit()if __name__ == "__main__":main()

截图如下:

在这里插入图片描述

对于上述的Demo,基本函数用法如下:

  1. 创建 Word 应用程序实例word = win32com.client.Dispatch("Word.Application")

  2. 使 Word 界面可见word.Visible = True

  3. 创建一个新的文档doc = word.Documents.Add()

  4. 向文档中写入文本

  5. 保存文档doc.SaveAs(r"C:\path\to\your\file.docx")

  6. 关闭文档doc.Close(False)

  7. 退出 Word 应用程序word.Quit()

以上的Demo比较简易,如果想花里胡哨还可使用如下:

  • 插入段落:
paragraph = doc.Paragraphs.Add()
paragraph.Range.Text = "This is a new paragraph."
  • 设置文本格式:
range_obj.Font.Name = "Arial"
range_obj.Font.Size = 12
range_obj.Font.Bold = True
range_obj.Font.Italic = True
  • 插入表格
table = doc.Tables.Add(range_obj, 3, 3)
table.Cell(1, 1).Range.Text = "Row 1, Col 1"
table.Cell(1, 2).Range.Text = "Row 1, Col 2"
table.Cell(1, 3).Range.Text = "Row 1, Col 3"
  • 正文文字替换
find = doc.Content.Find
find.Text = "old text"
find.Replacement.Text = "new text"
find.Execute(Replace=2)
  • 页眉页脚文字替换:
header_range = doc.Sections(1).Headers(win32com.client.constants.wdHeaderFooterPrimary).Range
header_find = header_range.Find
header_find.Text = "old header text"
header_find.Replacement.Text = "new header text"
header_find.Execute(Replace=2)
  • 打印文档doc.PrintOut()

更多的Demo如下:

  1. 正文文字替换
import win32com.clientdef main():word = win32com.client.Dispatch("Word.Application")word.Visible = True# 打开一个现有的文档doc = word.Documents.Open(r"C:\path\to\your\file.docx")# 进行文字替换find = doc.Content.Findfind.Text = "old text"find.Replacement.Text = "new text"find.Execute(Replace=2)  # 2 表示 wdReplaceAll# 保存并关闭文档doc.Save()doc.Close(False)word.Quit()if __name__ == "__main__":main()
  1. 页眉页脚文字替换
import win32com.clientdef main():word = win32com.client.Dispatch("Word.Application")word.Visible = True# 打开一个现有的文档doc = word.Documents.Open(r"C:\path\to\your\file.docx")# 访问页眉header_range = doc.Sections(1).Headers(win32com.client.constants.wdHeaderFooterPrimary).Rangeheader_find = header_range.Findheader_find.Text = "old header text"header_find.Replacement.Text = "new header text"header_find.Execute(Replace=2)# 访问页脚footer_range = doc.Sections(1).Footers(win32com.client.constants.wdHeaderFooterPrimary).Rangefooter_find = footer_range.Findfooter_find.Text = "old footer text"footer_find.Replacement.Text = "new footer text"footer_find.Execute(Replace=2)# 保存并关闭文档doc.Save()doc.Close(False)word.Quit()if __name__ == "__main__":main()
  1. 打印文档
import win32com.clientdef main():word = win32com.client.Dispatch("Word.Application")word.Visible = True# 打开一个现有的文档doc = word.Documents.Open(r"C:\path\to\your\file.docx")# 打印文档doc.PrintOut()# 关闭文档doc.Close(False)word.Quit()if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点? 二、解答 删除链表中指定的结点,就像是排好队的⼩朋友⼿牵着⼿,将其中⼀个⼩朋友从队伍中分出来,只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况: (1&am…

HTML静态网页成品作业(HTML+CSS)——我的家乡江永网页设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol(原Penpad),推出了首个资产即其生态代币PDD的Launch,Season 2活动主要是用户通过质押ETH代币、组件战队等方式,来获得Point奖励,并以该Point为依…

2024 Google I/O大会:全方位解读最新AI技术和产品

引言: 2024年的Google I/O大会如期举行,作为技术圈的年度盛事之一,谷歌展示了其在人工智能领域的最新进展。本次大会尤其引人注目,因为它紧随着OpenAI昨天发布GPT-4o的脚步。让我们详细解析Google此次公布的各项新技术和产品&…

svn如何远程访问?

svn(Subversion)是一种版本控制系统,广泛应用于软件开发领域。它能够追踪文件和目录的变化,记录每个版本的修改内容,并允许多人协同开发。svn的远程访问功能允许开发人员可以在不同的地点访问和管理代码,提…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

EasyCVR智慧校园建设中的关键技术:视频汇聚智能管理系统应用

一、引言 随着信息技术的迅猛发展,智慧校园作为教育信息化建设的重要组成部分,对于提升校园安全、教学效率和管理水平具有重要意义。本文旨在介绍智慧校园视频管理系统的架构设计,为构建高效、智能的校园视频监控系统提供参考。 二、系统整…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中,介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

gin自定义验证器+中文翻译

gin自定义验证器中文翻译 1、说明2、global.go3、validator.go4、eg:main.go5、调用接口测试 1、说明 gin官网自定义验证器给的例子相对比较简单,主要是语法级别,便于入门学习,并且没有给出翻译相关的处理,因此在这里记…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决: 问题3的解决: 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename: 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

新人学习笔记值(初始JavaScript)

一、Java Script是什么 1.Java Script是世界上最流行的语言之一,是一种运行在客户端的脚本语言(script是脚本的意思) 2.脚本语言:不需要编译,运行过程中由js解释器(js引擎)进行解释并运行 3.现在…

Vue原理学习:vdom 和 diff算法(基于snabbdom)

vdom 和 diff 背景 基于组件化,数据驱动视图。只需关心数据,无需关系 DOM ,好事儿。 但是,JS 运行非常快,DOM 操作却非常慢,如何让“数据驱动视图”能快速响应? 引入 vdom 用 vnode 表示真实…

联合新能源汽车有限公司出席2024年7月8日杭州快递物流展

参展企业介绍 青岛联合新能源汽车有限公司(简称:联合汽车),是一家专注于纯电动汽车领域创新的科技公司,在国内率先提出车电分离,电池标准化并共享的方案,研发了包含标准电池、电池仓、可换电纯电…

Bootstrap Studio for Mac:打造专业级网页设计软件

对于追求高效与品质的设计师和开发者来说,Bootstrap Studio for Mac无疑是最佳选择。它建立在广受欢迎的Bootstrap框架之上,输出干净、语义化的HTML代码。同时,强大的CSS和SASS编辑器,支持自动建议和规则验证,让您的设…

深度学习500问——Chapter08:目标检测(9)

文章目录 8.5 目标检测的技巧汇总 8.5.1 Data Augmentation 8.5.2 OHEM 8.5.3 NMS:Soft NMS/ Polygon NMS/ Inclined NMS/ ConvNMS/ Yes-Net NMS/ Softer NMS 8.5.4 Multi Scale Training/Testing 8.5.5 建立小物体与context的关系 8.5.6 参考relation network 8.5.…

QCustomplot---动态图

QCustomplot绘制动态曲线图-游标及鼠标跟踪显示数值_qcustomplot 游标-CSDN博客 m_timer new QTimer(this);connect(m_timer,SIGNAL(timeout()),this,SLOT(slotTimeout()));m_timer->start(50); void MainWindow::slotTimeout() {static int p0;static int i0;double m,m1…

简单聊聊分布式和集群

前言 分布式和集群,我们都听的比较多,分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚,这篇文章我们就一起看看两者到底是什么,有什么区别。 什么是分布式系统? 先看下书面解释: 分布式系统…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的,它针对稠密向量数据集的相似搜索而设计,能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片,流式数据插入,动态schema&#xff0c…

STM32手写寄存器的方式实现点亮LED灯

这次是从头开始学习STM32,看野火的视频开始学习,感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的,能够学习到很多的细节之处,有时会感觉很啰嗦,但是不得不说确实很详细,只有…

线程池 ThreadPool

一般情况下我们都使用Thread类创建线程,因为通过Thread对象可以对线程进行灵活 的控制。但过多创建线程和销毁线程,会消耗掉大量的内存和CPU资源, 假如某段时间内突然爆发了100个短小的线程,创建和销毁这些线程就会消耗很多时间&a…