docx
下载
pip install pywin32
pip install docx
代码
# -*- coding: utf-8 -*-
import docx
import os
from glob import glob
from win32com import client as wc
from docx.shared import Cm, Pt, Inches
from docxcompose.composer import Composer
from datetime import datetime
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
import time
class control_docx():
def __init__(self, file_path):
self.doc = docx.Document(file_path)
@staticmethod
def doc_to_docx(base_file):
"""
doc转docx
:param base_dir: 要转换的doc文件所在文件夹,也是保存新docx的文件夹
:return:
"""
p = base_file
new_file = p.replace('doc', 'docx')
if os.path.exists(new_file):
return
word = wc.DispatchEx('Word.Application')
# 后台运行,不显示,不警告
wc.Visible = False
wc.DisplayAlerts = 0
doc = word.Documents.Open(p) # 目标路径下的文件
doc.SaveAs(new_file, 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件 #12为docx
doc.Close()
word.Quit()
# return 'ok'
@staticmethod
def merge_docx(base_dir, save_path, name):
"""
合并docx
:param base_dir: 所有要合并的docx文件的文件夹
:param save_path: 要保存合并后文件的文件夹
:param name: 合并后的文件名字
:return:
"""
base_dir = base_dir
save_path = save_path
def combine_all_docx(files_list):
number_of_sections = len(files_list)
master = docx.Document()
composer = Composer(master)
for i in range(0, number_of_sections):
doc_temp = docx.Document((files_list[i]))
composer.append(doc_temp)
composer.save(os.path.join(save_path, str(name) + '.docx'))
# 执行
path_list = glob(os.path.join(base_dir, '*.docx'))
combine_all_docx(path_list)
def up_table(self, table_num, row, col, content, if_center=False):
"""
更新某个表格的某个单元格
:param table_num: 第n个表格
:param row: 行
:param col: 列
:param content: 替换内容
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
a.text = content
if if_center:
a.paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
a.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
def get_table_cell(self, table_num, row, col):
"""获取某个表格的单元格内容"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
return a.text
def up_table2(self, table_num, row, col, contents):
"""
更新某个表格的某个单元格.MD5/SHA256专属
:param table_num: 第n个表格
:param row: 行
:param col: 列
:param contents: 替换内容(字典类型)
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
# # 获取a单元格所有段落对象。如果单元格是空,那么只有一个空段落对象
ps = a.paragraphs
# 获取第一个段落对象
for i in ps:
if (i.text == "说明:") or (i.text == " Description:"):
break
self.delete_paragraph(i)
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
# # 获取a单元格所有段落对象。如果单元格是空,那么只有一个空段落对象
ps = a.paragraphs[0]
# 修改整个段落内容
for k, v in contents.items():
ps.insert_paragraph_before(k)
ps.insert_paragraph_before(v)
def up_table3(self, contents):
"""修改列表专属"""
change_list_table_num = self.table_row(3)
if len(contents) > int(change_list_table_num):
num = len(contents) - change_list_table_num
self.add_table_row(num + 1, 3)
elif len(contents) < int(change_list_table_num):
num = change_list_table_num - len(contents)
for i in range(num - 1):
self.delete_table_row(3, -1)
else:
pass
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[3]
shading_list = locals()
color_str = "D3D3D3"
for i in range(self.table_row(3)):
shading_list['shading_elm_' + str(i)] = parse_xml(
r'<w:shd {} w:fill="{bgColor}"/>'.format(nsdecls('w'), bgColor=color_str))
table.rows[i].cells[0]._tc.get_or_add_tcPr().append(shading_list['shading_elm_' + str(i)])
for index, content in enumerate(contents):
self.up_table(3, index + 1, 0, content['编号'], if_center=True)
self.up_table(3, index + 1, 1, content['严重程度'], if_center=True)
self.up_table(3, index + 1, 2, content['分类'], if_center=True)
# 获取word中第n个表格对象
tables = self.doc.tables
table = tables[3]
a = table.cell(index + 1, 3) # 获取第row行第col列单元格对象
# # 获取a单元格所有段落对象。如果单元格是空,那么只有一个空段落对象
content_text = ""
a.text = content_text
ps = a.paragraphs[0]
for i in content['修改内容说明']:
ps.insert_paragraph_before(i)
def up_table4(self, table_num, row, col, contents):
"""
更新某个表格的某个单元格cpu微码专属
:param table_num: 第n个表格
:param row: 行
:param col: 列
:param contents: 替换内容(字典类型)
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
# # 获取a单元格所有段落对象。如果单元格是空,那么只有一个空段落对象
a.text = ""
# 获取word中第n个表格对象
table = tables[table_num]
a = table.cell(row, col) # 获取第row行第col列单元格对象
# # 获取a单元格所有段落对象。如果单元格是空,那么只有一个空段落对象
ps = a.paragraphs[0]
# # # 修改整个段落内容
for v in contents:
ps.insert_paragraph_before(v)
# for k, v in contents.items():
# ps.insert_paragraph_before(k+":"+v)
def table_row(self, table_num):
"""
获取表格行数
:param table_num: 表格
:return: 表格行数
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
row_num = len(table.rows)
return row_num
def delete_table_row(self, table_num, row):
"""
删除某行
:param table_num:要删除的表格数
:param row: 删除的行
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
try:
table = tables[table_num]
row = table.rows[row]
row._element.getparent().remove(row._element)
except Exception as e:
print(e)
def add_table_row(self, count, table_num):
"""
增加表格行数
:param count: 添加行数
:param table_num: 第n个表格
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
for i in range(count):
table.add_row() # 给表格增加一行
table.style = "Table Grid"
def add_table_col(self, count, table_num):
"""
增加表格列数
:param count: 添加列数
:param table_num: 第n个表格
:return:
"""
tables = self.doc.tables
# 获取word中第n个表格对象
table = tables[table_num]
for i in count:
table.add_column(Cm(5)) # 给表格增加一列
def replace_paragraphs(self, num, content):
"""
替换某段内容
:param num: 要替换的某段
:param content: 要替换的内容
:return:
"""
n = 0
for paragraph in self.doc.paragraphs:
n += 1
tmp = content
runs = paragraph.runs
if n == num:
for i, run in enumerate(runs):
run.text = run.text.replace(run.text, tmp)
def delete_paragraph(self, paragraph):
"""删除段落"""
p = paragraph._element
p.getparent().remove(p)
paragraph._p = paragraph._element = None
def docx_save(self, save_path):
"""
保存文件
:param save_path: 保存文件路径
:return:
"""
self.doc.save(save_path)