大家好,今天有一个公务员的小伙伴委托我给他帮个忙,大概是有这样一份Word(由于涉及文件私密所以文中的具体内容已做修改)


一共有近2600条类似格式的表格细栏,每个栏目包括的信息有:

  • 日期

  • 发文单位

  • 文号

  • 标题

  • 签收栏

需要提取其中加粗的这三项内容到Excel表格中存储,表格样式如下:


也就是需要将收文时间、文件标题、文号填到指定位置,同时需要将时间修改为标准格式,如果是完全手动复制和修改时间,依照一个条目10s的时间计算,一分钟可以完成6条,那么最快也需要:

这类格式规整的文件整理非常适合用Python来执行,好的那么接下来请Python出场,必要的信息我在代码中以注释信息呈现。
首先使用Python将Word文件导入

# 导入需要的库docx
from docx import Document

# 指定文件存放的路径
path = r'C:\Users\word.docx' 

# 读取文件
document = Document(path)

# 读取word中的所有表格
tables = document.tables
再把问题逐个划分,首先尝试获取第一张表第一个文件条目的三个所需信息
# 获取第一张表
table0 = tables[0]

仔细观察可以发现一个文件条目占据了3行,所以对表格全部行循环迭代时可以设步长为3

注意观察表格,按照row和cell把所需内容解析清楚

# 在全局放一个变量用来计数填序号
n = 0
for i in range(0, len(table0.rows) + 1, 3):
    # 日期
    date = table0.cell(i, 1).text
    # 标题
    title = table0.cell(i + 1, 1).text.strip()
    # 文号
    dfn = tables[j].cell(i, 3).text.strip()
    print(n, date, tite, dfn)
接下来需要解决的是,时间我们获取的是 2/1 这种 日/月的形式。我们需要转化成 YYYY-MM-DD格式,而这利用到datetime包的strptimestrftime函数:
  • strptime: 解析字符串中蕴含的时间

  • strftime: 转化成所需的时间格式

import datetime

n = 0
for i in range(0, len(table0.rows) + 13):
    # 日期
    date = table0.cell(i, 1).text
    # 有的条目时间是空的,这里不做过多判别
    if '/' in date:
        date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d')
    else:
        date = '-'
    # 标题
    title = table0.cell(i + 11).text.strip()
    # 文号
    dfn = tables[j].cell(i, 3).text.strip()
    print(n, date, tite, dfn)
这样一张表的内容解析就完成了,注意这里用的是table[0]即第一张表,遍历所有的表加一个嵌套循环就可以,另外也可以捕获异常增加程序灵活性
n = 0
for j in range(len(tables)):
    for i in range(0, len(tables[j].rows)+13):
        try:
            # 日期
            date = tables[j].cell(i, 1).text
            if '/' in date:
                date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d')
            else:
                date = '-'
            # 标题
            title = tables[j].cell(i + 11).text.strip()
            # 文号
            dfn = tables[j].cell(i, 3).text.strip()
            n += 1
            print(n, date, title, dfn)
        except Exception as error:
            # 捕获异常,也可以用log写到日志里方便查看和管理
            print(error)
            continue
信息解析和获取完成就可以导出了,用到的包是openpyxl
from openpyxl import Workbook

# 实例化
wb = Workbook()
# 获取当前sheet
sheet = wb.active
# 设立表头
header = ['序号''收文时间''办文编号''文件标题''文号''备注']
sheet.append(header)
在最内层解析循环的末尾加上如下代码即可
row = [n, date, ' ', title, dfn, ' ']
sheet.append(row)

线程的最后记得保存

wb.save(r'C:\Users\20200420.xlsx')
运行时间在10分钟左右,大概离开了一会程序就执行结束了


最后附上完整代码,代码很简单,理清思路最重要

from docx import Document
import datetime
from openpyxl import Workbook

wb = Workbook()
sheet = wb.active
header = ['序号''收文时间''办文编号''文件标题''文号''备注']
sheet.append(header)


path = r'C:\Users\word.docx'
document = Document(path)
tables = document.tables

n = 0
for j in range(len(tables)):
    for i in range(0, len(tables[j].rows)+13):
        try:
            # 日期
            date = tables[j].cell(i, 1).text
            if '/' in date:
                date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d')
            else:
                date = '-'
            # 标题
            title = tables[j].cell(i + 11).text.strip()
            # 文号
            dfn = tables[j].cell(i, 3).text.strip()
            n += 1
            print(n, date, title, dfn)
            row = [n, date, ' ', title, dfn, ' ']
            sheet.append(row)
        except Exception as error:
            # 捕获异常,也可以用log写到日志里方便查看和管理
            print(error)
            continue

wb.save(r'C:\Users\20200420.xlsx')


©著作权归作者所有:来自51CTO博客作者mb5fe18e32e4691的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 技术解析:如何用pyecharts绘制时间轮播图
  2. PHP中date()函数输出的时间与Linux不一致怎么办?
  3. PHP常用日期时间操作合集
  4. PHP日期时间快速入门(图文详解)
  5. PHP如何计算两个时间段交集的天数?
  6. php时间戳转换成时间的方法
  7. 基于 Carbon 的时间穿梭 Travel 扩展包
  8. PHP时间戳和日期格式相互转换
  9. php中session时间设置浅析

随机推荐

  1. android textview 行间距
  2. android系统中自带的图标大全
  3. 关于Android开发的editText控件怎…
  4. IDA - Support for Android
  5. Android交互式视觉设计控件二
  6. Android™ 1.6 android.R.drawable Icon
  7. 【Android】使用MediaCodec硬编码实现视
  8. android 圆角头像
  9. 380个Android实例
  10. Android安装卸载程序具体操作方法解析