首页 > 其他分享 >记录word替换数据-2

记录word替换数据-2

时间:2024-05-27 23:45:17浏览次数:27  
标签:docx word 记录 doc list file path 替换

# 导入模块
from docx import Document
import os
from win32com.client import Dispatch
import pandas as pd


# 转换doc文件
def doc_to_docx(file_path):
    """
    将指定的doc文件转化为docx格式
    :param file_path: 文件路径
    """
    word = Dispatch("Word.Application")
    # 打开原始文档
    doc = word.Documents.Open(file_path)
    # 将文档另存为docx格式
    new_file_path = os.path.splitext(file_path)[0] + ".docx"
    doc.SaveAs(new_file_path, 16)
    # 关闭文档
    doc.Close()
    word.Quit()
    # 删除原始文件——正式发布后删除原文件
    # os.remove(file_path)
    # 打印操作过程
    print(f"{file_path}已经被成功转换为{new_file_path}")
    return new_file_path


#
# def main():
#     # 定义文件夹路径和Word应用程序对象
#     folder_path = r"C:\临时"
#     # 遍历文件夹中所有的.doc文件,并将其转换为.docx格式
#     for root, dirs, files in os.walk(folder_path):
#         for file in files:
#             if file.endswith(".doc"):
#                 file_path = os.path.join(root, file)
#                 doc_to_docx(file_path, word)
#
#     # 关闭Word应用程序
#     word.Quit()
#
#     print("全部doc文件已经全部转换为docx!")


# # 创建doc对象
# doc = Document('文档.docx')


def replace_word(doc_path, excel_path):
    """
    定义批量替换文字的函数
    :param doc_path: 上传的word模板
    :param excel_path: excel的数据表
    :return:
    """
    # 判断传入文件后缀名,docx包只能用于处理docx文件
    end = os.path.splitext(doc_path)[1]
    if (end == '.doc') | (end == '.DOC'):
        docx_path = doc_to_docx(doc_path)
    else:
        docx_path = doc_path

    # 读取数据文件
    df = pd.read_excel(excel_path, dtype=str)
    df.fillna('', inplace=True)
    for i in df.iterrows():
        # 读取模板文件创建docx对象
        doc = Document(docx_path)
        # 迭代df,并将列明和每一行内容组成字典
        data_dict = dict(i[1])
        # 列表化并压缩表头 行内容 分配给旧值与新值(eg:倒转list内容,避免mark1替换mark11为  替换内容1 ,优先替换mark11
        old_word_list = list(data_dict.keys())
        new_word_list = list(data_dict.values())
        old_word_list.reverse()
        new_word_list.reverse()
        print(old_word_list, new_word_list)
        # 用倒转后的列表,进行替换
        for old_word, new_word in zip(old_word_list, new_word_list):
            print(old_word, '已替换', new_word)

            # 核心检索替换部分
            for p in doc.paragraphs:  # 遍历文档段落
                for run in p.runs:  # 遍历段落的字块
                    # print(run.text)
                    run.text = run.text.replace(old_word, new_word)  # 替换字块的文字,然后赋值给字块

            # 遍历文档的表格, 替换表格里的要替换的文字
            for table in doc.tables:
                for row in table.rows:
                    for cell in row.cells:
                        # print(cell.text)
                        cell.text = cell.text.replace(old_word, new_word)
        #  已替换数据中第一个值为新名称命名生成的word文件
        doc.save(os.path.join(os.path.dirname(docx_path), list(data_dict.values())[0] + '.docx'))


# 执行替换函数

doc_path = r'E:\开发\1565-法人变更模板填写机器人\法人变更模板填写机器人20230103\模板.doc'
excel_path = r'E:\开发\1565-法人变更模板填写机器人\法人变更模板填写机器人20230103\excel数据.xlsx'
replace_word(doc_path, excel_path)

# print(os.path.dirname(doc_path))

# dict_1 = {
#     '1': '2',
#     '2': '2',
#     '3': '2'
#     }
# print(list(dict_1.keys()), type(list(dict_1.keys())))

标签:docx,word,记录,doc,list,file,path,替换
From: https://www.cnblogs.com/AZ26/p/18216868

相关文章

  • 记录word数据替换-1
    #导入模块importtkinter.filedialogimportosfromwin32com.clientimportDispatchimportpandasaspdimportwin32com.client#转换doc文件defreplace_main(word,old_text,new_text,output_path):#word.Selection.Find.ClearFormatting()#word.Sele......
  • 记录一个pdf转xlsx的方法
    importtkinter.filedialogimportpandasaspdimportosimportpdfplumberimporttkinterclassPdfReader:#output_file=tkinter.filedialog.asksaveasfile(title='保存到',initialfile=f"{name}.xlsx",filetypes=[("excel文件",......
  • CF 随机跳题记录
    \(0\)表示完全没看题解,\(1\)表示看了一点题解,\(2\)表示抄的题解。12001245B-RestrictedRPS【1】指令:/duelproblem1200constructive_algorithms标签:构造,贪心\(4\)发。aclink。第一眼看题感觉和构造完全没有关系。当可以使用的时候尽量使用,填上对应的字符串。如......
  • 推式子的做题记录
    「LOJ#3399」CommunicationNetwork首先列出式子,\(ans=\sum\limits_{T_2}|T_1\capT_2|2^{T_1\capT_2}\)注意到有\(f(S)=\sum\limits_{T\subseteqS}\sum\limits_{T'\subseteqT}(-1)^{T-T'}f(T')\)证明可考虑计算每个\(T'\)的贡献,由于\(T'\subse......
  • 不同厂商SOC芯片在视频记录仪领域的应用
    不同SoC公司芯片在不同产品上的应用信息:大唐半导体芯片型号:LC1860C(主控)+LC1160(PMU)产品应用:红米2A(399元)大疆晓Spark技术规格:28nm工艺,4个ARMCortex-A7处理器,1.5GHz主频,2核MaliT628GPU,1300万像素摄像处理,1080P@30fps编解码Movidius芯片型号:Myriad2......
  • 力扣刷题记录: 2134. 最少交换次数来组合所有的 1 Ⅱ
        这道题是第275场周赛的Q2,LC竞赛分为1748,主要考察滑动窗口。说实话这道题要想到是滑动窗口就很简单,否则就根本无从下手。方法一.滑动窗口(时间超过62.53%C++用户)        处理环形数组的一个很有效的技巧就是“追加”,把整个nums数组追加到nums数组后面,......
  • MySQL函数查询目录树问题记录
    DELIMITER//CREATEFUNCTION`getChildXzqhList`(rootIdBIGINT)RETURNSVARCHAR(4000)BEGINSETSESSIONgroup_concat_max_len=1000000;--设置为1MB设置GROUP_CONCAT函数输出的最大长度大小,太小的话整体会被截掉RETURN(WITH......
  • 记录接口操作日志, 原始数据和变更数据 这几个工具可以看看
    mzt-biz-log支持Springboot,基于注解的可使用变量、可以自定义函数的通用操作日志组件此组件解决的问题是:「谁」在「什么时间」对「什么」做了「什么事」Github地址:https://github.com/mouzt/mzt-biz-logMyBatis-Plus数据变动记录插件https://baomidou.com/plugins/data-ch......
  • pgsq的学习记录②——PostgreSQL基础用法
    PostgreSQL基础用法创建一个数据库操作数据库创建表删除表表插入数据查询表多表联查创建一个数据库创建一个名为postgres的数据库createdbpostgres操作数据库创建表创建表weatherCREATETABLEweather(cityvarchar(80),temp_lo......
  • 近期一次护网蓝队面试记录分享
    近期一次护网蓝队面试记录分享前言以下为近期的一次蓝队面试记录,答案为本人回答仅作参考,错误之处,多多包涵面试过程及回答自我介绍如实回答学校经历,是否参与项目,尽量简短把你参与的项目和成功说出来就行使用过哪些设备,出现误报怎么办(在校生未使用,网上搜的,背诵就行)天眼,EDR,全......