解决python处理word文档时的两个问题,截取内容和页眉横线

目标:截取word中的一部分内容生成一个新的文件,并且给这个文件一个新的页眉和页脚。

解决python处理word文档时的第一个问题,如何截取。首先word和pdf是不一样的,pdf是按页划分的,word的内容不是按页划分的,同一个文件word和wps打开就可能出现不同的页码(其实也有代码可以实现,好像要判断是否超出页的范围)。

在截取word时,使用python库的python-docx,截取paragraphs(段落)和allTables(表格),首先找到段落的起始位置,删除这部分以外的内容与,表格也是如此,不再展示。部分代码如下图。

for aPara in paragraphs:
   p1 = aPara._element #删除代码片段
   if aPara.text == '':  #字符串=''
       a = paragraphs.index(aPara) #a的位置
       if paragraphs.index(aPara) > a: #大于a
          p1.getparent().remove(p1) #删除代码片段

值得注意的是,可以利用迭代器找到aPara(段落)后的第一个表格,方便找到表格。这个表格和EXCELL的表格也不太一样,EXCELL的表格是一个表格,word内视觉上的一个表格可以是多个表格合起来的(按行拆分表格的既视感),输出表格内容的时候容易出现out of range,这里面有坑......欢迎大家来填坑。部分代码如下图。

 for aPara in paragraphs:
    if aPara.text == '':
       ele = aPara._p.getnext()  # .迭代器next下一个数据
         while (ele.tag != '' and ele.tag[-3:] != 'tbl'): 
         # 当ele.tag== ''或者ele.tag[-3:] == 'tbl'就会输出,while()本身是一个循环
            ele = ele.getnext()
               if ele.tag != '':
                  for aTable in allTables:
                      if aTable._tbl == ele:
                          ......

致此实现的word文件截取部分内容,这部分内容另存为一个word文件不再展示。

解决python处理word文档时的第二个问题,如何给新文件一个新的页眉页脚。python-docx是一个非常全面的库,一般来说word文件处理找它就完事了,要求输出文件的页眉带横线,python-docx库中没有这个东西,很折磨,很折磨......一个库解决不了的事情就再加一个库win32com。注意这里所说明的页眉带横线不是页眉文字或图片带下划线,要求如下图。

首先还是先用python-docx设置一下页眉页脚格式,毕竟它全面。部分代码如下图。

footer = document.sections[-1].footer
document.sections[-1].footer_distance = docx.shared.Cm(2.1)  # 修改页脚到底端的距离
header = document.sections[-1].header
document.sections[-1].header_distance = docx.shared.Cm(0.9)  # 修改页脚到底端的距离
document.sections[-1].different_first_page_header_footer = False  # 去除首页不同

 接下来从页眉页脚模板.docx模板文件中复制粘贴替换输出文件的页眉页脚。当然模板并非绝对,这里页脚替换了部分内容,部分代码如下图。

# ==========================================================
w = win32com.client.Dispatch('Word.Application')
w.Visible = 0  # 后台运行,不显示
w.DisplayAlerts = 0  # 后台运行,不警告
doc1 = w.Documents.Open(template)  # 打开新的文件
w.ActiveDocument.Sections[0].Headers[0].Range.Copy()
wc = win32com.client.constants
doc1.Close()
# ==========================================================
w.Visible = 0  # 后台运行,不显示
w.DisplayAlerts = 0  # 后台运行,不警告
doc2 = w.Documents.Open(n3)
w.ActiveDocument.Sections[0].Headers[0].Range.Paste()
doc2.Close()
# ==========================================================
w.Visible = 0  # 后台运行,不显示
w.DisplayAlerts = 0  # 后台运行,不警告
doc3 = w.Documents.Open(template)
w.ActiveDocument.Sections[0].Footers[0].Range.Copy()
doc3.Close()
# ==========================================================
w.Visible = 0  # 后台运行,不显示
w.DisplayAlerts = 0  # 后台运行,不警告
doc4 = w.Documents.Open(n3)
w.ActiveDocument.Sections[0].Footers[0].Range.Paste()                      
w.ActiveDocument.Sections[0].Footers[0].Range.Find.ClearFormatting()                     
w.ActiveDocument.Sections[0].Footers[0].Range.Find.Replacement.ClearFormatting()
w.ActiveDocument.Sections[0].Footers[0].Range.Find.Execute('页脚替换前的文字', False, False,True,False, False, False, 1, False, '页脚替换后的文字', 2)
w.ActiveDocument.SaveAs(n3)
doc4.Close()

大体的一个思路就是这样的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

国服小闲鱼请战

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

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

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

打赏作者

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

抵扣说明:

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

余额充值