最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的。就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这样无聊的工作,确定目标后我便开始在网上寻找有没有造好的轮子,但是结果让我有点儿失望。关于python操作页眉页脚的文章屈指可数,仅存在的几篇也都是片段代码,仅仅可以参考而已,于是我便决定自己是实现批量替换页眉页脚的脚本。

  经过搜集资料发现,python可以通过win32com以及docx扩展包来实现对word的操作,但是经过实际操作发现docx对文件页眉页脚的处理不是很理想,于是我最终决定使用win32com来实现此功能。

  使用的模块确定下来后就是思路的问题,小小的记录一下:

  1、替换页眉页脚可以分成两个部分来实现,一个是针对单个文件的处理,另一个是针对文件夹下所有文件的处理,为了分别对此两种情况进行不同的处理使用if判断语句来让程序进入不同的逻辑。

  2、针对文件夹下所有文件需要处理的情况,则使用python的内置模块os将文件夹下所有doc文件的绝对绝对路径拼接出来,以便实现对每一个文件的操作。对于单个文件的处理则不需要这样来做,只需要将文件的决定路径确定下来即可。

  3、在确定了文件的路径之后便开始进行对word的操作,在进行测试过程中发现这里存在一个很大的坑,那就是word分节符的存在,分节符将整个word文档分成了若干部分,每个部分的页眉和页脚是独立的,在这个地方绕了我好几个小时。最终经过查资料发现section就是word的中每一个部分的对象,使用它便可以分别定位到每一个部分,解决了这个问题后剩下的逻辑便一气呵成。

  接下来直接上代码:

import win32com,os,sys,re

from win32com.client import Dispatch, constants

import os,time

class Change_file_footer_header():
'''批量更改word文件的页眉页脚'''

  def __init__( self ):

    self.file_or_files = input('请选择需要修改文件或者文件夹 only 代表只修改一个文件 many 代表修改文件夹下的所有文件 :')
    self.method = input( '请选择需要更改的类型 1 代表页眉,2代表页脚:')
    self.path = input( '请输入需要更改文件的目录名称:')
    self.old_name = input( '请输入需要更替换的名称:')
    self.new_name = input( '请输入替换的名称:')

  def change_header( self ,path ,file ):
    ''' 更改文件的页眉 '''

    w = win32com.client.Dispatch('Word.Application')
    w.Visible = 0
    w.DisplayAlerts = 0

    doc = w.Documents.Open( path )
    a = w.ActiveDocument.Sections
    n = 0
    for i in range( len(a) ):

      name = w.ActiveDocument.Sections[i].Headers[0]
      old_name = str(name)
      print( old_name )

      if self.old_name in old_name:
        new_name = old_name.replace( self.old_name,self.new_name )
        print( new_name )
        w.ActiveDocument.Sections[i].Headers[0].Range.Find.ClearFormatting()
        w.ActiveDocument.Sections[i].Headers[0].Range.Find.Replacement.ClearFormatting()
        w.ActiveDocument.Sections[i].Headers[0].Range.Find.Execute( self.old_name, False, False, False, False, False, False, 1, False, self.new_name, 2 )
      n = n+1
    doc.Close()
    create_time = time.strftime('%Y/%m/%d:%H/%M/%S', time.localtime(time.time()))
    text = '{} : {}文件====总共替换了{}个页眉'.format(create_time, file, n)
    self.log(text)

  def change_footer( self ,path ,file ):
  ''' 更改文件的页脚 '''

    w = win32com.client.Dispatch('Word.Application')
    w.Visible = 0
    w.DisplayAlerts = 0

    doc = w.Documents.Open( path )
    a = w.ActiveDocument.Sections
    n = 0
    for i in range( len(a) ):

      name = w.ActiveDocument.Sections[i].Footers[0]
      old_name = str(name)
      print( old_name )

      if  self.old_name in old_name:
        new_name = old_name.replace( self.old_name,self.new_name )
        print( new_name )
        w.ActiveDocument.Sections[i].Footers[0].Range.Find.ClearFormatting()
        w.ActiveDocument.Sections[i].Footers[0].Range.Find.Replacement.ClearFormatting()
        w.ActiveDocument.Sections[i].Footers[0].Range.Find.Execute( self.old_name, False, False, False, False, False, False, 1, False, self.new_name, 2)
        n = n+1
    doc.Close()
    create_time = time.strftime('%Y/%m/%d:%H/%M/%S',time.localtime(time.time()))
    text = '{} : {}文件====总共替换了{}个页脚'.format( create_time,file, n)
    self.log(text)

  def change_file_header( self ):
    ''' 循环遍历所输入的文件夹 '''

    for root, dirs, files in os.walk( self.path ):

    for i in files:
      if i.split('.')[1] == 'docx' or i.split('.')[1] == 'doc':
      print( '更改文件的名称',i )
      file_path = os.path.join( root,i )
      self.change_header( file_path ,i )
      #time.sleep( 1 )

  def change_file_footer( self ):
  ''' 循环遍历所需要修改页脚的文件夹 '''

    for root, dirs, files in os.walk( self.path ):

      for i in files:
        if i.split('.')[1] == 'docx' or i.split('.')[1] == 'doc':
          print( '更改文件的名称',i )
             file_path = os.path.join( root,i )
               self.change_footer( file_path ,i )

  def log(self,text):
    '''输出日志模块'''
    file_name = './' + time.strftime('%Y%m%d%H',time.localtime(time.time())) + '.' + 'txt'
    with open( file_name,"a+" ) as f:
      f.write( text )
      f.write( '\n' )

  def run( self ):

    if self.file_or_files == 'only':
      file_name = self.path.split( '\\' )[ -1 ]
      if self.method == '1':
        self.change_header( self.path ,file_name )
      elif self.method == '2':
        self.change_footer( self.path,file_name )

    elif self.file_or_files == 'many':
      if self.method == '1':
        self.change_file_header()
      elif self.method == '2':
        self.change_file_footer()

    else:
      print( '请输入正确的选择 only或者 many' )

if __name__ == '__main__':
  Change_file_name = Change_file_footer_header()
  Change_file_name.run()

python 使用win32com实现对word文档批量替换页眉页脚的更多相关文章

  1. Python将word文档批量转PDF

    前面有一篇<Python批量创建word文档(2)- 加图片和表格>的文章,利用这篇文章创建的word文档来批量转PDF文档.代码: 1 ''' 2 #python批量将word文档转换成 ...

  2. IText实现对PDF文档属性的基本设置

    一.Itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...

  3. 自动化工具word文档批量转html

    企业有很多的科室,科室的每个人或多或少都会写一些文档,有些文档领导需要浏览,解决的办法是将编辑的文档打印出来,供领导浏览,或是为了节约企业成本,文档就在人与人这间或部门之间copy过来,copy过去. ...

  4. word文档批量合并工具

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; En ...

  5. 【JAVA与DOM4J实现对XML文档的CRUD操作】

    一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...

  6. C# 实现对PPT文档加密、解密以及重置密码的操作

    工作中我们会使用到各种各样的文档,其中,PPT起着不可或缺的作用.一份PPT文档里可能包含重要商业计划.企业运营资料或者公司管理资料等.因此,在竞争环境里,企业重要资料的保密工作就显得尤为重要,而对于 ...

  7. jaxp实现对xml文档的增,删,改,查操作(附源码)浅析

    jaxp,属于javase中的一部分.是对xml进行解析的一个工具类: 既然说到这里,还是讲全一点,讲讲上面说到的xml的解析技术. xml的一个标记型文档. 在html的层级结构中,它会在内存中分配 ...

  8. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

    以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  9. openpyxl库实现对excel文档进行编辑(追加写入)

    首先,这个库只支持xlsx格式的excel文件 预期,对”excel_test.xlsx“的A1单元格写入”hello word“ 1.安装”openpyxl“库,pip install openpy ...

随机推荐

  1. Cannot connect to WMI Provider & Invalid class [0x80041010]

    数据库服务器(Virtual Machine)所在的Nutanix一台主机由于故障,VM自动切换到另一台主机,切换过程中VM会重新启动,但是早上检查的时候,发现点击SQL Server Configu ...

  2. EOS之hello智能合约解析

    传送门: 柏链项目学院   EOS的智能合约与以太坊区别很大, EOS 的智能合约基于 WebAssembly(WASM) 技术执行用户生成的应用程序和代码.WASM是一项新兴的网络标准,得到了谷歌, ...

  3. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)

    最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...

  4. ASP.NET基础知识汇总之WebConfig自定义节点详细介绍

    之前介绍过Webconfig的具体知识ASP.NET基础知识汇总之WebConfig各节点介绍.今天准备封装一个ConfigHelper类,涉及到了自定义节点的东东,平时虽然一直用,但也没有系统的总结 ...

  5. docker 数据卷和docker数据卷容器以及数据卷的备份和还原

    一:数据卷 1.什么是数据卷 数据卷是通过特殊设计的目录,可以绕过联合文件系统,为一个或者多个容器提供服务,数据卷是在docker宿主机当中,数据卷可以是文件也可以是文件夹. 2.特点 1.数据卷在容 ...

  6. nginx学习路线

    nginx:熟透,配置.rewrite.黑白名单.脚本.代理.优化等

  7. [Alpha阶段]测试报告

    [Alpha]阶段测试报告 在测试过程中发现的BUG ​ 在最后的测试阶段中,我们不可避免的遇到了各种各样的BUG.虽然大多数都不是严重的BUG,但是这些细枝末节的问题的堆积,依然会很大程度上降低用户 ...

  8. vuex 状态管理 通俗理解

    解释:集中响应式数据管理,一处修改多处使用,主要应用于大中型项目. 安装: 第一:index.js:(注册store仓库) npm install vuex -D // 下载vuex import V ...

  9. mysql数据库连接语句一定要加传参的编码格式

    jdbc:mysql://localhost:3306/pachong?useUnicode=true&characterEncoding=UTF-8 不然可能会出现从源代码传出的中文参数到m ...

  10. ExcelPower_Helper插件功能简述与演示

    部分功能演示简述: 1.文件目录浏览功能        此功能主要利用了ribbon的dynamicmenu控件,动态呈现自定义目录下的文件列表信息,支持点击打开,查看文件所在目录.功能来源于大神li ...