python操控docx

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)

在使用Python的`win32com`和`docx`模块来操控Word文档时,如果你想要清除单元格(可能是指表格中的空行)中的空白页,这个过程涉及到打开文档、定位到特定的单元格区域并删除其中的空白页。由于`docx`库主要处理的是文本和格式,而不是直接操作单元格内的内容,通常我们需要借助`openpyxl`或其他专门处理Excel文件的库来管理电子表格。 然而,针对Word文档,你可能需要先确定你是否在处理表格,因为Word中的"单元格"概念与Excel不同。如果是在Word表格中,你可以尝试使用`win32com`来操作每个表格行的行高度,移除多余的行间距以达到类似的效果。但请注意这并不是标准的"清除空白页"操作,而更像是调整行距。 以下是一个示例,假设我们有一个表格,我们想删除表格中每一行的空白行[^2]: ```python # 导入所需模块 from win32com.client import Dispatch # 创建Word应用实例 word = Dispatch("Word.Application") word.Visible = False # 后台运行 # 打开文档 doc = word.Documents.Open('your_word_file.docx') try: # 假设表格位于第一个表格中 table = doc.Tables(1) for row in table.Rows: # 获取当前行的高度 height = row.Height # 如果高度接近于0,可能是空白行 if height < some_threshold: # 根据实际需求设置阈值 # 删除该行 row.Delete() except Exception as e: print(f"Error occurred: {e}") # 保存并关闭文档 doc.SaveAs('your_cleaned_word_file.docx', FileFormat=17) # 17表示PDF格式 doc.Close() word.Quit() ``` 请注意,这段代码只是一个基本示例,实际操作可能会更复杂,具体取决于你的Word文档结构和需求。另外,对于Word表格的操作,`openpyxl`更适合,因为它专为Excel设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值