使用win32com操作word的方法记录(一)

基于工作需要,最近需要对word进行一些批量操作,但考虑到word中VBA学习成本较高(多是VBA教程针对Excel),我想到了使用python进行操作,首先使用的是python-docx库。

对于docx库,经过博客学习和阅读原文档后,我发现虽然python-docx库简单容易上手,但是其两个缺点比较明显:

1、只能操作docx文件,对于doc文件,需要转化后再使用。

2、其paragraphs与tables是两组完全不同的对象,两者无法进行联系,所以单独添加、修改、删除段落或者表格内容,使用该库比较方便,但是一旦需要获取某表格前对该表的描述等信息(提取一堆表总需要知道这个表名字叫啥吧),就相当困难了。

经过一段时间的探索,决定使用win32com库。本文就记录一下从安装到使用win32com操作word的过程,当作学习的巩固和笔记。python-docx库的相关记录打算另开一篇文章来写。

1、安装

安装win32com库时就遇到了麻烦,各种报错,可惜当时报错的时候并没有截图,配置好了环境我又不想再来一遍,所以就不上图了,说一下主要的错误代码和解决方法吧。

在cmd中使用python -m pip install pypiwin32进行安装。安装过程中报错无数次,但错误代码基本上就是依据——“unable to find vcvarsall.bat”,网上对此错误的解决方法五花八门,经过逐一尝试,终于在微软问答区找到了答案。

原文链接如下:https://blogs.msdn.microsoft.com/pythonengineering/2016/04/11/unable-to-find-vcvarsall-bat/#comments

使用win32com操作word的方法记录(一)_第1张图片

2、使用

CSDN博客中有众多对win32com库操作word的说明,对于通用的内容本文将一笔带过,主要介绍目前来看独一无二的内容。

import win32com
from win32com.client import Dispatch
#导入库
word_app = win32com.client.Dispatch('Word.Application')
#调用word程序
word_app.Visible = 0
word_app.DisplayAlerts = 0
#不在前台显示文档及错误,在实际使用阶段可以全部关闭,提高运行速度,但是在调试时打开还是用处挺大的,可以对操作是否实现自己的需求进行直观的判断,比如说我们选中的内容是否已经高亮等等。
doc = word_app.Documents.Open(u'C:\\模板.doc')
#文档路径,暂时未尝试路径能否直接使用变量解决
#路径前的u还是必要的,尤其是路径中存在中文时,否则会报错
title_list = []
for lenth in range(0,len_tables):
#这里的len_tables是在其他函数中已经定义的变量,其为读取的整个文档表格个数。
    table_index = lenth + 1
    #个人感觉win32com库操作word时也用到了很多vba的功能,例如很多代码就和vba比较相似,但是又有一些不同,所以在操作时报错报到怀疑人生。
    #在这里doc.Range().Tables(table_index)中,表格的序号不再是从0开始,而是从1开始。
    for i in range(0,5): 
    #循环获取指定表格前的第一段文字,一般第一段文字就是表格标题,绝大多数的文档排版后表格前一般会有一段空行,但一般也不会太多。
        x = doc.Range().Tables(table_index).Range.Start
        #获取表格开始的位置,即在整个word文档中的位置
        f = doc.Paragraphs(doc.Range(0,x).Paragraphs.Count - i).Range()
        #获取最后一段的内容,其原理为先计算从文档开头到表格开始时总共有几段,然后从最后一段开始向前数
        if f.replace(" ","").replace("\n","").replace("\r","") != "":  
        #去除换行符及空格影响,并且判断是否为空行。
            title_list.append(f)
            #将获取的表格标题放到列表中,由于列表有顺序,之后取用也就方便多了。
            break
    doc.Close()
    #关闭文档
    word_app.Quit()
    #关闭word程序

核心内容写在代码注释里,逐行解释代码更直观说明。

就先记录到这里,文章主要是想来说明如何将word中的表格和段落进行结合操作,核心思想是寻找段落或者表格在文档中的定位,再根据定位进行下一步的操作。

之后再用到该库操作word的其他方法和思路,本系列还会继续更新。 

你可能感兴趣的:(学习笔记)