最近有同事找我帮忙,需要分离一下多个Word中的表格然后把所有表格整合到一个WORD里。
1. python-docx介绍
作为“Python大法”的推崇者,当然是选择Python了,于是从网上查了一下,比较傻瓜的方式是使用python-docx库进行操作,那么话不多说,先在conda中来一个
pip install python-docx
简单的讲一讲,python-docx主要可以用于对Word进行读取、解析然后生成Word文件。感兴趣的小伙伴可以去看一看官方文档进行高阶功能的学习。
列举一些简单的用法
import docx
# 读取Word
doc = docx.Document('test.docx')
# 查看Word中的段落(文字内容)
for para in doc.paragraphs:
# 打印文本内容
print(para.text)
# 查看Word中的表格
for table in doc.tables:
# 遍历表格的所有行
for row in table.rows:
# 打印表格中一行的内容
row_str = '\t'.join([cell.text for cell in row.cells])
print(row_str)
# 创建新的Word
new_doc = docx.Document()
# 添加新段落
new_doc.add_paragraph('XXX')
# 添加新表格
new_doc.add_table(rows = XX, cols = XX)
# 保存Word
new_doc.save('out.docx')
2. 老文档表格的分离并粘贴进入新文档
显然根据上一段的介绍,老文档表格的分离直接通过doc.tables便可以进行。那么如何把分离出的表格放入新的文档呢?之前以为能直接复制粘贴进行,然而大量查询下发现python-docx并不支持这样的工作,那么就需要考虑不能完全保持表格格式的情况下,如何进行表格的复制。
(原文档内容)
2.1. 暴力法
把表格一个个的格子内容放在新的文档创建的表格中
tables = old_doc.tables
for old_table in tables:
n_rows = len(old_table.rows)
n_cols = len(old_table.rows[0].cells)
new_table = new_doc.add_table(rows = n_rows,cols = n_cols,style='Light Grid Accent 1')
for i,new_row in enumerate(new_table.rows):
new_cells = new_row.cells
for j,new_cell in enumerate(new_cells):
new_cell.text = old_table.rows[i].cells[j].text
new_doc.add_paragraph('')
以上方法生成文档如下:
我们发现这样生成时,会把原有的合并的单元格拆开,并赋为同样的内容。
2.2. 其他提取法
为了解决新表格中单元格被切分的问题,又去网上查了一下相关的资料,找到了一下方法进行新表格的创建
from copy import deepcopy
new_doc = docx.Document()
for template in old_doc.tables[0]:
tbl = template._tbl
new_tbl = deepcopy(tbl)
paragraph = new_doc.add_paragraph()
paragraph._p.addnext(new_tbl)
new_doc.add_paragraph('')
new_doc.tables[0].style = 'Colorful List'
以上生成文档如下:
单元格合并的问题解决了,然而还是存在表格格式不能与原来保持一致的问题。这个希望有大佬能帮忙解决一下。
3. 其余(持续更新)
3.1. doc -> docx
python-docx只能处理.docx格式文档,所以如果遇到.doc 需要大家先把doc转化为docx,这个方法大家在网上都很容易查到哦,就先不讲了。