应我家领导要求,开发一个word文档批处理脚本,涉及word文档、excel表格、文件存取、排序与索引、简单GUI等内容,前期针对各分项功能实现写了几篇小文章,现在将总体思路记录一下,作为这个系列的完结篇。

由于针对目标文档进行了很多特定操作,源代码本身不具备通用性,下面主要精讲其中的关键部分。完整代码、示例文档详见:

开发需求:

素材为批量word文档集(docx):位于original文件夹中。文件名为“N.xxxx.docx”(N为数字、xxxx为文档标题)。(见附图)

文件内容为各类新闻报道,排版为标题、正文内容(包括图片)、签名尾行(署名+日期)。(见附图)

需实现的功能包括:

建立文档清单,清单内容包括序号、署名、日期、标题。

排序文档清单,署名+日期联合排序,署名按照指定的排序规则表排序(见附图)。

筛选文档,从清单中筛选满足特定要求(比如日期范围)的文档,生成筛选后的清单,并从原始文档集中提取这些文档。

修订文档,将文档重新排版(标题行+空一行+正文段落+签名尾行+空两行),并校订文档中的标点错误(英文标点误用、省略号不准确等)。

合并文档,将筛选、修订后的文档合并为一个统一的文档,保持各子文档的排版格式不变。

图形界面,正逢领导生日,所以除了好用,还要好看,传送门在此:爱coding:心形绘制的小改进:turtle模块

original文件夹示例

文档内容示例

排序规则表.txt

逻辑图设计:

对程序主体逻辑梳理如下。

关键代码实现:

清单操作

程序涉及的清单包括:default_database.xls(原始清单,如没有提供则需生成)、all_queued.xls(按照媒体、时间排序后的总清单)、screen_queued.xls(特定年份的清单)。为便于查看,这些清单都要求生成Excel表格。

原始清单(如有)采用xlrd模块读取,所有清单生成则采用xlwt模块。xlrd、xlwt模块基本概念和涉及到的操作在另一篇文章中介绍:

其中重复进行的操作,如excel表格生成(genXls())独立为函数,通过函数调用来实现复用,以减少代码量。

其中比较重要的一点就是对时间格式的处理。日期相关操作采用datetime模块,时间格式转换采用time模块。

word文档、excel表格中文本格式表示的日期:

首先通过正则表达式搜索得到文本格式的日期datestr,然后识别日期分隔符(’/’, ‘-‘等),并采用time.strptime()从字符串中提取年月日数值,最后通过datetime.datetime()构造日期格式数据。

date_pat = re.compile('\d{4}\D\d{1,2}\D\d{1,2}') # 日期格式的正则表达式YYYYxMMxDD

...

sch = re.search(date_pat, para.text) #提取文本格式的日期

if sch: #如匹配到日期

datestr = para.text[sch.start() : sch.end()]

split = []

for char in datestr: #识别日期分隔符

if char not in digit:

split.append(char)

y, m, d = time.strptime(datestr,

'%Y' + '%s' % split[0] + '%m' + '%s' % split[1] + '%d')[0:3] #提取年月日数值

date = datetime.datetime(y, m, d) #构造datetime日期格式

excel表格中日期格式表示的日期:

从excel中读取的日期是一个浮点数,需采用xlrd.xldate_as_datetime(cell,0)转为datetime.datetime日期格式。

向excel写入日期时,通过ws.write(r, c, content, mf)中的mf(style实例)设置成excel日期格式。

mf = xlwt.XFStyle()

mf.num_format_str = 'yyyy/mm/dd' #设置日期格式为:年/月/日

ws.write(r, c, content, mf)

另外一点就是excel表格中的文档清单排序,包括按媒体(排序规则表.txt)和按日期进行排序。特别是按媒体名称排序,为避免前序操作改变了后续步骤的索引位置,采用倒序的冒泡法排序,具体方法见:

文档操作

文档操作包括:对单篇文档的文字、格式修订;多篇文档合成为一个总文档。

文档操作整体采用docx模块,其中文字修订采用正则表达式来搜索(string、re模块)。docx模块基本概念和涉及到的操作在另一篇文章中介绍:

其中重复进行的操作,如文档格式设置(setdocStyle())、文本内容修订(refText())独立为函数,通过函数调用来实现复用,以减少代码量。

setdocStyle()直接调用可设置为默认格式(包括字体、字体大小、首行缩进、段前间距、段后间距、行距等),也可通过关键字参数修改格式。

refText()可实现对所有文本内容的检查和修正,目前实现了中英文标点符号的修订、回引号缺失修正、省略号错误提示。

word文档图片提取值得详细说明一下,图片提取采用了zipfile模块。

大家知道docx模块可通过doc.inline_shapes提取所有内联图形,也即嵌入方式插入文档的图形。但是,其他方式(比如浮于文字上方、四周环绕等)的图片不会包括在doc.inline_shapes中,这些图片只能通过doc.paragraphs[n].runs[m].element.drawing_lst来识别。

docx格式本质是xml文件的压缩包,将docx文档后缀名改为zip,然后解压缩,就可以得到如下图所示的内容,其中word文件夹为文档主要信息储存位置,该文件夹中的media文件夹即包括所有图片内容(按文档中的顺序命名)。

docx文档解压缩后的内容

word文件夹打开后的内容

因此,本文通过块中的drawing_lst来判断文档中是否有图片,对于有图片的文档,采用zipfile解压缩提取media文件夹中的所有图片。实例代码如下。

# 指定用于提取图片的临时zip文件、文件夹

temp_zip = 'temp.zip'

temp_dir = 'temp'

fig_unloaded = True #记录图片是否已经载入

...

# doc.inline_shapes无法识别非嵌入式图片,故直接从段落块判定有无图

if run.element.drawing_lst:

if fig_unloaded: #如本doc还未载入图片,此处载入

silence = shutil.copy(os.path.join(src_dir, doc_name), temp_zip)

f = zipfile.ZipFile(temp_zip)

for file in f.namelist():

if file.startswith('word/media/image'):

silence = f.extract(file, temp_dir)

f.close()

img_dir = os.path.split(silence)[0]

img_list = os.listdir(img_dir) #所有图片路径的清单

fig_unloaded = False #本文档图片已载入,不再重复载入

...

# 临时文件清理

if os.path.exists(temp_zip):

os.remove(temp_zip)

if os.path.exists(temp_dir):

shutil.rmtree(temp_dir)

图片插入word文档,则采用doc.paragraphs[n].runs[m].add_picture()完成,不再细讲。

欢迎关注我的公众号(zz-icoding),以后将逐步整理成系列化的python学习资源。

python批量处理word格式_用python批量处理word文档相关推荐

  1. python怎么读取sav格式_利用Python读取外部数据文件

    利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...

  2. python爬贴吧回复_通过python爬取贴吧数据并保存为word

    前言 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发 ...

  3. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  4. python模糊匹配忽略大小写_在python中忽略大小写的简单方法?

    如果搜索多个单词,则创建一个集合是有意义的:print(set(brown_sents).intersection(zip(repeat(most_ambiguous_word), word_clas ...

  5. xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走

    来自word妹,侵联系删 在处理文档时,我们时常需要复制或者插入内容等,那如何保持格式不发生变化呢?本期与大家分享4个保持格式不变的Word技巧. 1.复制内容,如何保持与文本格式一致? 复制文本内容 ...

  6. svn回退后如何再还原_设计师如何管理自己的文档

    随着项目的积累,我们的文件目录会变得十分的盘大,如果不好好管理,将会变得一团糟,有时会影响到我们工作的效率与心情,好的文档管理方式会在一定程度上让我们的工作更加有序,即时文件目录再多,按照已经制定好的 ...

  7. wps如何在目录里面打省略号_在wps中怎么让文档目录的省略号对齐 - 卡饭网

    怎么在WPS中快速统计文档字数? 怎么在WPS中快速统计文档字数? 相信很多小伙伴在日常办公中都有用到WPS,在其中如何才能统计文档字数呢?方法很简单,下面小编就来为大家介绍.具体如下:1. 首先,打 ...

  8. word打开wps文件乱码_Word打开WPS文档成乱码怎么办

    Word打开WPS文档成乱码怎么办 最近一位同事拿来一篇WPS做的论文,请我帮他修改后再打印出来,我的电脑中安装的字处理软件是Word XP.记得Office XP中自带了WPS文档转换器,一向没机会 ...

  9. 删除Office Word (Excel)中Recent Document最近文档中本地和online打开文件路径已经不存在的文件记录

    上次写了一篇删除Office(Word,Excel,PowerPoint)中Recent Document最近文档地址不存在的文件,注重从注册表中删除记录,后来发现有问题,online打开文件的记录在 ...

  10. 显示法定格式的日期合同和其他法律文档中经常使用下列日期格式: Dated this day of ,19 . (严格的格式要求)

    程序:显示法定格式的日期合同和其他法律文档中经常使用下列日期格式: Dated this    day of    ,19  . 编写程序用来显示这种格式的日期.用户以月/日的格式录入日期,然后计算机 ...

最新文章

  1. 《图像分类》概述,李飞飞经典CS231N2021《卷积神经网络视觉识别》课程第二讲!...
  2. 安装LINUX后要怎么找回WIN7启动项?
  3. 原创经验:微信小程序开发总结
  4. Simulink仿真 第八节 积分模块
  5. Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn
  6. 视频解码芯片SAA7111A的初始化
  7. ie浏览器中 textarea 不能自动换行
  8. 动态规划入门G - Super Jumping! Jumping! Jumping! (有关最优子序列的一个相关题目)...
  9. 基于FreeFEM++的有限元编程--2
  10. java 操作word宏_java调用microsoft office(如word、excel)的宏 | 学步园
  11. 解决mysql报错ERROR 2002 (HY000)
  12. 使用Python处理excel表格(openpyxl)教程
  13. Window 10 电源高性能模式设置
  14. 圆梦之旅 – 日本(一)攻略篇
  15. 先验分布,后验分布,似然函数
  16. 基于K均值算法的鸢尾花聚类实验(Sklearn实现)
  17. c++最佳情侣身高差(来测一测)
  18. 软件流程和管理(七):个人、激励和团队
  19. 解决方案|电力行业应如何应对数字化转型危机
  20. create-react-app :无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\create-react-app.ps1,因为在此系统上禁止运行

热门文章

  1. c语言程序设计题目湖南大学,湖南大学C语言期末考试样卷
  2. 计算机无纸化考试合卷答题笔记卡,高级会计师无纸化考试攻略都在这 第一次考也不用慌...
  3. 超级授权专业版 SuperSU Pro v2.68 简体中文版
  4. 长尾理论 推荐系统长尾理论
  5. python扫码点餐系统_微信小程序源代码带后台 扫码点餐系统 python Django 前后端分离...
  6. 迅捷在线PDF转换成Word转换器简介
  7. Android移动数据开关开启关闭方法
  8. 6 - 常用模块(os,sys,timedatetime,random,jsonpicle,shelve,hashlib)
  9. 神秘的罗斯柴尔德家族
  10. Ruby erb模板文件生成html网页的示例