项目要求
有一份统计了某地区教师信息的 Word 文件,其中内容的一部分如下图所示:
一共有近千条类似格式的表格细栏,每个栏目包括的信息有:
- 序号
- 教师姓名
- 出生日期
- 身体状况
- 任教经历
我们的任务是将这些内容提取到 Excel 表格中存储,表格样式如下:
也就是需要将 Word 中的内容填到指定位置,同时需要将时间修改为标准格式,这类格式规整的文件整理非常适合用Python来执行。
实现步骤
- Step1:用 docx 库打开 Word 文件;
- Step2:用 openpyxl 库建立一个新的 Excel 文件;
- Step3:提取 Word 文件中的内容(用 datetime 库改变日期格式);
- Step4:将提取到的内容存储到 Excel 文件。
代码实现
1、导入需要的库
from docx import Document
import datetime
from openpyxl import Workbook
2、创建 Excel 文件
这里我们使用 openpyxl 库中的 Workbook 类来创建一个新的 Excel 文件,并先将表头写入这个文件中。
wb = Workbook()
sheet = wb.active
header = ['序号', '姓名', '出生日期', '身体状况', '任教经历']
sheet.append(header)
3、打开 Word 文件
这里我们使用 docx 库中的 Document 类来打开需要提取内容的 Word 文件,并在里面找到表格。
path = 'Teacher list.docx'
document = Document(path)
tables = document.tables
其中,tables 是一个含有所有表格的列表。(因为我们这里就一张表格,所以 len(tables) 就是 1 了)
4、遍历并提取表格内容
在这里我们可以使用 try except 语句来捕获异常。
n = 0
for j in range(len(tables)):
for i in range(0, len(tables[j].rows)+1, 2):
try:
# 姓名
name = tables[j].cell(i, 1).text
# 日期
date = tables[j].cell(i, 2).text
if '/' in date:
date = datetime.datetime.strptime(date, '%d/%m/%Y').strftime('%Y-%m-%d')
else:
date = '-'
# 身体状况
body = tables[j].cell(i, 3).text
# 任教经历
work = tables[j].cell(i + 1, 1).text.strip()
n += 1
print(n, name, date, body, work)
row = [n, name, date, body, work]
sheet.append(row)
except Exception as error:
# 捕获异常,也可以用log写到日志里方便查看和管理
print(error)
continue
因为一个老师的信息占 Word 中表格的两行,但是在 Excel 中只占一行,所以对一个表格 tables[j] 来说,每遍历两行才切换到 Excel 的下一行(由变量 n 控制)。
此处代码中用到了 datetime 库中的函数来改变日期形式,将日/月/年转换成年-月-日。
5、存储内容到 Excel 中
wb.save(r'Teacher list.xlsx')
完整代码
from docx import Document
import datetime
from openpyxl import Workbook
wb = Workbook()
sheet = wb.active
header = ['序号', '姓名', '出生日期', '身体状况', '任教经历']
sheet.append(header)
path = 'Teacher list.docx'
document = Document(path)
tables = document.tables
n = 0
for j in range(len(tables)):
for i in range(0, len(tables[j].rows)+1, 2):
try:
# 姓名
name = tables[j].cell(i, 1).text
# 日期
date = tables[j].cell(i, 2).text
if '/' in date:
date = datetime.datetime.strptime(date, '%d/%m/%Y').strftime('%Y-%m-%d')
else:
date = '-'
# 身体状况
body = tables[j].cell(i, 3).text
# 任教经历
work = tables[j].cell(i + 1, 1).text.strip()
n += 1
print(n, name, date, body, work)
row = [n, name, date, body, work]
sheet.append(row)
except Exception as error:
# 捕获异常,也可以用log写到日志里方便查看和管理
print(error)
continue
wb.save(r'Teacher list.xlsx')