項目要求
有一份統計了某地區教師信息的 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')