【Python】【python-docx讲解】
参考:https://www.jianshu.com/p/8d8a75a50190
最近因项目需要,需从一个word文件中提取表格中的数据至另外一个word文件的表格中,每次操作都较为麻烦,所以写了一段python代码实现此功能,需要用到python-docx库(pip install python-docx),下面将对其语法进行详解。
1.需要导入的库
from docx import Document(文档读写)
from docx.shared import Pt (字体大小)
from docx.shared import Inches
from docx.oxml.ns import qn(设置字体格式)
from docx.shared import RGBColor (设置字体颜色)
from docx.enum.text import WD_ALIGN_PARAGRAPH (设置对其方式)
2.文档读取
doc=Document('文件路径') #打开word文档
paras=doc.paragraphs #获取文件段落
tables=doc.tables #获取文件表格
table=tables[0] #获取第一个表格
table=tables[0].cell(1,2).text #获取表格1的第二行第三列的表格内容
—————获取表格1的内容————
for row in table.rows:
for cell in row.cells:
print(cell.text)
3.文档操作
doc=Document() #创建一个空白文档
p1=doc.add_paragraph() #初始化建立一个自然段
p1.alignment=WD_ALIGN_PARAGRAPH.CENTER #对齐方式为居中,没有这句话默认左对齐
p1.paragraph_format.line_spacing=1.5 #设置该段落,行间距为1.5倍
p1.paragraph_format.first_line_indent=Inches(0.5) #段落缩进0.5英寸
p1.paragraph_format.left_line_indent=Inches(0.5) #设置左缩进0.5英寸
p1.paragraph_format.right_line_indent=Inches(0.5) #设置右缩进0.5英寸
p1.space_after=Pt(5) #设置段后距离为5磅
p1.space_before=Pt(5) #设置段前距离为5磅
run1=p1.add_run(u'你好') #写入文本“你好”
run1.font.size=Pt(12) #设置字体大小为12
run1.font.bold=True #设置加粗
run1.italic=True #设置斜体
para_heading1=doc.add_heading('',level=2) #返回一个2级标题
run2=para_heading=para_heading.add_run(u'前言') #添加二级标题前言
#添加图片
doc.add_picture('照片路径', width=Inches(1.25))
#增加表格
table=doc.add_table(rows=3, cols=3, style='Table Grid') #创建一个3行3列的表格,样式为黑色框
table.cell(0, 0).text=u'你好' #添加第一行第一列内容为“你好”
table.cell(2,0).merge(table.cell(2,2)) #合并第三行第一列至第三列单元格
table.columns[
doc.save(D:\word.docx) #保存文件在D盘,命名为word.docx
此方法虽然可以完成对段落的设置,但是每增加一个段落都要重新设置样式,因此可以设置统一的标题,各个标题都可以采用,具体代码如下所示:代码中 "Normal"表示正文的样式,["Heading 2"]表示2级标题的样式,当然一级标题的样式关键字为["Heading 1"],u代表后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
doc=Document() #创建一个空白文档
doc.styles["Normal"].font.name=u'Times New Roman' #设置正文字体为Times New Roman
doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') #设置中文字体为宋体
上述两句连用的含义是设置中文字体为宋体,西文字体为Times New Roman
doc.styles["Normal"].font.color.rgb=RGBColor(255,0,0) #设置正文全局颜色为红色
doc.styles["Normal"].font.size=Pt(12) #设置字体大小为12磅
doc.styles["Heading 2"].font.size=Pt(20) #设置全局2级标题的字体大小为20磅
直接附上代码
import os from docx import Document from docx.oxml.ns import qn from docx.shared import Pt class File_transfer_to_wordtable(): """提取文件内容至新的word""" def __init__(self, file_path): self.file_path = file_path def tables(self): """读取文件,获取文件中的表格""" file_exist = os.path.exists(self.file_path) if file_exist: document=Document(self.file_path) #打开"文件" tables=document.tables #获取文件中的表格集 return tables else: return "此文件不存在!" def new_document(self): """ 在新文件中新建表格,插入表头 """ tables_num = len(self.tables()) new_document = Document() # 创建文档对象 new_document.styles["Normal"].font.size = Pt(7) new_document.styles['Normal'].font.name = 'Times New Roman' new_document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') new_table = new_document.add_table(rows=tables_num-1, cols=6, style='Table Grid') new_table.cell(0, 0).text = u"序号" new_table.cell(0, 1).text = u"变更活动编号" new_table.cell(0, 2).text = u"需求和故障描述" new_table.cell(0, 3).text = u"涉及更改说明" new_table.cell(0, 4).text = u"更改波及影响分析" new_table.cell(0, 5).text = u"用例选取" """读取变更说明中的第3个到最后一个表的内容""" for i in range(2, tables_num): table = self.tables()[i] cell_1 = table.cell(0, 1).text cell_2 = table.cell(1, 1).text cell_3 = table.cell(5, 1).text cell_4 = table.cell(6, 1).text cell_34 = "变更文件:"+ cell_3 +"\n"+ "变更模块:" + cell_4 cell_5 = table.cell(9, 1).text cell_6 = table.cell(11, 1).text """将表中内容填入另一个word中""" new_table.cell(i-1, 0).text = str(i-1) new_table.cell(i-1, 1).text = cell_1 new_table.cell(i-1, 2).text = cell_2 new_table.cell(i-1, 3).text = cell_34 #若涉及到的测试用例为空,则写入无 if cell_5 == "": new_table.cell(i-1, 4).text = "无" else: new_table.cell(i-1, 4).text = cell_5 new_table.cell(i-1, 5).text = cell_6 """保存word文档""" new_document.save("D:\\file\word.docx")
#创建实例 word=File_transfer_to_wordtable("D:\\file\xxx.docx") print(word.tables()) word.new_document()