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

前言

对于自动化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.client

def 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.client

def 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.client

def main():
    word = win32com.client.Dispatch("Word.Application")
    word.Visible = True

    # 打开一个现有的文档
    doc = word.Documents.Open(r"C:\path\to\your\file.docx")

    # 进行文字替换
    find = doc.Content.Find
    find.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.client

def 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).Range
    header_find = header_range.Find
    header_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).Range
    footer_find = footer_range.Find
    footer_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.client

def 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()
  • 44
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
项目简介 本项目使用 python3.5,包管理使用 pip3.5,用 pyaudio 录音, numpy 计算, scipy 滤波, pylab 绘制波形与频谱。 项目环境 推介在与项目根目录同级目录内通过 virtualenv 建立 python 虚拟环境: virtualenv --no-site-packages venv 第一次会自动安装一些虚拟环境文件,安装完后再激活虚拟环境, Windows 环境下使用: venv\Scripts\activate Linux 环境下使用: source venv/bin/activate cd 回到项目根目录,项目依赖都写在 requirements.txt , Windows 在我的 Win 10 环境 numpy 1.11.1+mkl 和 scipy 0.18.1 两个包都不能通过 pip 安装成功,因此我去加利福尼亚大学镜像源下载了 numpy scipy 这两个包的 win 下支持的 .whl 文件并先通过 pip 安装: pip install numpy-1.11.1+mkl-cp35-cp35m-win_amd64.whl pip install scipy-0.18.1-cp35-cp35m-win_amd64.whl 然后再用 pip 安装 requirements.txt 的依赖: pip install -r requirements.txt 全部通过安装后才算是建立好项目环境了 Ubuntu 14.04 trusty 由于项目使用 Travis-CI 的系统是 ubuntu 14.04 trusty,因此 ubuntu 下的安装依赖可以参考 .travis.yml 使用 travis_env_init.sh 进行安装, 在上面 virtualenv 环境,项目根目录下,使用以下命令执行安装: sudo source travis_env_init.sh 或者 sudo ./travis_env_init.sh 预安装完成后,再 pip install -r requirements.txt 安装剩下的依赖。 安装脚本本来是针对 Travis 的环境,并非写的兼容的,如有其他包安装失败,请手动排查。 配置说明 本项目使用 百度语音识别 API,所以请先去 百度语音开放平台 建立工程,申请 API key、 Secret key,具体申请过程可参见 玩转百度语音识别,就是这么简单 这篇文章。 ./BaiduSpeech 目录下的 BaiduOAuthSample.ini 是配置示例文件,先复制 BaiduOAuthSample.ini 为 BaiduOAuth.ini,再按照文件示例对应位置填写自己的 api_key secret_key,键值间等号左右各空一格,值项无需引号,若已有 token 可填写 access_token 项。 使用说明 根目录的 SpeechRecognise.py 为语音识别启动文件 python3.5 SpeechRecognise.py 启动后对准话筒说话,控制台将输出识别结果。(距离话筒的远近与话筒灵敏度相关) 结构说明 根目录的 SpeechRecognise.py 为语音识别启动文件, WaveOperate 包封装了一些对声卡的常用操作,如: 录音、播放、保存文件、读取文件、绘制声波、绘制频谱、声音滤波 等操作。 BaiduSpeech 包为对 Baidu API 调用的封装,其 BaiduOAuth.ini 为百度 API key 配置文件。 UnitTest 包为各模块的单元测试文件, 在项目根目录下执行命令 python3.5 -m nose -vs --with-coverage 将自动执行单元测试并输出结果和覆盖率。
文件: import scrapy from demo1.items import Demo1Item import urllib from scrapy import log # BOSS直聘网站爬虫职位 class DemoSpider(scrapy.Spider): # 爬虫名, 启动爬虫时需要的参数*必填 name = 'demo' # 爬取域范围,允许爬虫在这个域名下进行爬取(可选) allowed_domains = ['zhipin.com'] # 爬虫需要的url start_urls = ['https://www.zhipin.com/c101280600/h_101280600/?query=测试'] def parse(self, response): node_list = response.xpath("//div[@class='job-primary']") # 用来存储所有的item字段 # items = [] for node in node_list: item = Demo1Item() # extract() 将xpath对象转换为Unicode字符串 href = node.xpath("./div[@class='info-primary']//a/@href").extract() job_title = node.xpath("./div[@class='info-primary']//a/div[@class='job-title']/text()").extract() salary = node.xpath("./div[@class='info-primary']//a/span/text()").extract() working_place = node.xpath("./div[@class='info-primary']/p/text()").extract() company_name = node.xpath("./div[@class='info-company']//a/text()").extract() item['href'] = href[0] item['job_title'] = job_title[0] item['sa 报错: C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\python.exe "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\pydevconsole.py" --mode=client --port=55825 import sys; print('Python %s on %s' % (sys.version, sys.platform)) sys.path.extend(['C:\\Users\\xieqianyun\\demo1', 'C:/Users/xieqianyun/demo1']) Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 7.10.0 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 7.10.0 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') Traceback (most recent call last): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-fc5979762143>", line 1, in <module> runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/xieqianyun/demo1/demo1/begin.py", line 3, in <module> cmdline.execute('scrapy crawl demo'.split()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\cmdline.py", line 145, in execute cmd.crawler_process = CrawlerProcess(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 267, in __init__ super(CrawlerProcess, self).__init__(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 145, in __init__ self.spider_loader = _get_spider_loader(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 347, in _get_spider_loader return loader_cls.from_settings(settings.frozencopy()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings return cls(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__ self._load_all_spiders() File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders for module in walk_modules(name): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\utils\misc.py", line 73, in walk_modules submod = import_module(fullpath) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 994, in _gcd_import File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "C:\Users\xieqianyun\demo1\demo1\spiders\demo.py", line 4, in <module> from scrapy import log ImportError: cannot import name 'log'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值