Python批量替換Excel和Word中的關鍵字

一、問題的提出

有時,我們手頭上有多個Excel或者Word文件,但是領導突然要求對某幾個術語進行批量的修改,你是不是有要崩潰的感覺。因為這么多文件,要一個一個地打開文件,再進行批量替換修改,幾個文件還好,如果是成百上千的文件,我想你一會兒就感覺自己被搞暈了,不僅搞不清修改了沒有修改完,而且已經修改的也不知道修改的徹底不。

于是,問題來了,當我需要對多個Excel和Word文件中的關鍵字進行替換,而且不改變原文件的格式,同時刪除源文件,我們該怎么辦?這些office文件可能分布在不同的文件夾下,所以替換后還要存放在原來的文件夾。同時,我們編寫的程序還要在Windows和MacOS環境下都可以使用。

二、算法分析

由于要在多個環境下使用,我們放棄VBA,考慮采用Python編程的方法來解決。

1. 第一步?讀取一個替換關鍵字的"批量替換表.xlsx"生成一個字典,這樣是為了后面可以批量替換。第二步 遍歷當前目錄下所有目錄包括上當的文件,主要是docx和xlsx文件,如果是doc和xls文件,還要考慮兩這兩種格式的文件進行批量的轉化,見下面的文章 。

批量轉doc和xls為docx和xlsx文件

2. 第二步是 遍歷當前所有目錄中的文件,用if條件,根據文件擴展名的不同來篩選出docx和xlsx文件。代碼如下:

    for root, filefolder, files in os.walk(os.curdir):for file in files:if file.endswith("docx"):file_path = os.path.join(root, file)for key, value in dic.items():word_replace_keywords(file_path, key, value)elif file.endswith("xlsx") and os.path.basename(file)!="批量替換表.xlsx":file_path = os.path.join(root, file)for key, value in dic.items():excel_replace_keywords(file_path, key, value)

3. 第三步是對于docx和xlsx文件分別進行替換處理,主要采用了python-docx和openpyxls這兩個模塊來進行替換。針對docx文件,我們用Document()來讀取,用以下代碼來替換:

def info_update(doc, old, new):for para in doc.paragraphs:for run in para.runs:if old in run.text:run.text = run.text.replace(old, new)

對于xlsx文件我,我們通過下面的代碼實現關鍵字替換,同時不改變原來關鍵字的格式。

def replace_cell_text_with_format(cell, keyword, replacement):paragraphs = cell.paragraphsfor paragraph in paragraphs:for run in paragraph.runs:if keyword in run.text:new_text = run.text.replace(keyword, replacement)run.clear()  # 清除當前文本new_run = run._element  # 創建新的runnew_run.text = new_text  # 設置新文本for key in run._r.attrib.keys():  # 復制格式屬性if key != 't':new_run.attrib[key] = run._r.attrib[key]

4. 第四步?我們要保存替換后的文件,同時用os.remove()刪除原來的文件。

三、代碼展示

最終,我們編制出70多行的代碼,一鍵實現了多文件、多關鍵字、保存源格式,又能在Windows和蘋果電腦環境使用的程序。代碼如下:

import os
from docx import Document
from openpyxl import load_workbookdef info_update(doc, old, new):for para in doc.paragraphs:for run in para.runs:if old in run.text:run.text = run.text.replace(old, new)def replace_cell_text_with_format(cell, keyword, replacement):paragraphs = cell.paragraphsfor paragraph in paragraphs:for run in paragraph.runs:if keyword in run.text:new_text = run.text.replace(keyword, replacement)run.clear()  # 清除當前文本new_run = run._element  # 創建新的runnew_run.text = new_text  # 設置新文本for key in run._r.attrib.keys():  # 復制格式屬性if key != 't':new_run.attrib[key] = run._r.attrib[key]
def get_dic():workbook = load_workbook('批量替換表.xlsx')sht = workbook.activedic = {}for c1,c2 in zip(sht["A"],sht["B"]):if c1.value!= None and c2.value!= None:dic[c1.value] = c2.valuereturn dicdef word_replace_keywords(file_path, keyword, replacement):doc = Document(file_path)info_update(doc, keyword, replacement)try: for table in doc.tables:if not any(cell.text for row in table.rows for cell in row.cells):continue  for row in table.rows:for cell in row.cells:if keyword in cell.text:replace_cell_text_with_format(cell, keyword, replacement)except Exception as e:print("Error processing table:", e)doc.save(file_path)def excel_replace_keywords(file_path, keyword, replacement):wb = load_workbook(file_path)for sheet_name in wb.sheetnames:sheet = wb[sheet_name]for row in sheet.iter_rows():for cell in row:if cell.value and keyword in str(cell.value):cell.value = str(cell.value).replace(keyword, replacement)wb.save(file_path)wb.close()def get_replaced(dic):    for root, filefolder, files in os.walk(os.curdir):for file in files:if file.endswith("docx"):file_path = os.path.join(root, file)for key, value in dic.items():word_replace_keywords(file_path, key, value)elif file.endswith("xlsx") and os.path.basename(file)!="批量替換表.xlsx":file_path = os.path.join(root, file)for key, value in dic.items():excel_replace_keywords(file_path, key, value)
def main():dic = get_dic()get_replaced(dic)
if __name__ == "__main__":main()

以上代碼的優勢在于:速度快,設置好關鍵字后一鍵替換,可以在多個環境下使用,相比VBA代碼,Python代碼的執行速度更快、操作更簡單、省時省力。

四、注意事項

1. 運行代碼前一定要安裝Python3.9及以上版本,同時安裝openpyxl和python-docx兩個模塊。

2. 執行程序前要把doc和xls文件分別轉化為docx和xlsx文件,這樣更方便替換。

3. 執行前要在程序文件目錄下建立一個xlsx文件,命名為"批量替換表.xlsx",在表的A列放上要查找的關鍵字,B列放要替換的關鍵字。

4. 如果有問題,可以隨時與我聯系,也可以通過下面進行提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式之構建器(Builder)C++實現

1、構建器提出 在軟件功能開發中,有時面臨“一個復雜對象”的創建工作,該對象的每個功能接口由于需求的變化,會使每個功能接口發生變化,但是該對象使用每個功能實現一個接口的流程是穩定的。構建器就是解決該類現象的。構建就是定…

【Java】項目管理工具Maven的安裝與使用

文章目錄 1. Maven概述2. Maven的下載與安裝2.1 下載2.2 安裝 3. Maven倉庫配置3.1 修改本地倉庫配置3.2 修改遠程倉庫配置3.3 修改后的settings.xml 4. 使用Maven創建項目4.1 手工創建Java項目4.2 原型創建Java項目4.3 原型創建Web項目 5. Tomcat啟動Web項目5.1 使用Tomcat插件…

【CTF-web】備份是個好習慣(查找備份文件、雙寫繞過、md5加密繞過)

題目鏈接:https://ctf.bugku.com/challenges/detail/id/83.html 經過掃描可以找到index.php.bak備份文件,下載下來后打開發現是index.php的原代碼,如下圖所示。 由代碼可知我們要繞過md5加密,兩數如果滿足科學計數法的形式的話&a…

模型預測筆記(一):數據清洗及可視化、模型搭建、模型訓練和預測代碼一體化和對應結果展示(可作為baseline)

模型預測 一、導入關鍵包二、如何載入、分析和保存文件三、修改缺失值3.1 眾數3.2 平均值3.3 中位數3.4 0填充 四、修改異常值4.1 刪除4.2 替換 五、數據繪圖分析5.1 餅狀圖5.1.1 繪制某一特征的數值情況(二分類) 5.2 柱狀圖5.2.1 單特征與目標特征之間的…

OpenCV基本操作——算數操作

目錄 圖像的加法圖像的混合 圖像的加法 兩個圖像應該具有相同的大小和類型,或者第二個圖像可以是標量值 注意:OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作,而Numpy添加的是模運算 import numpy as np import cv2 as cv imp…

[數據集][目標檢測]鋼材表面缺陷目標檢測數據集VOC格式2279張10類別

數據集格式:Pascal VOC格式(不包含分割路徑的txt文件和yolo格式的txt文件,僅僅包含jpg圖片和對應的xml) 圖片數量(jpg文件個數):2279 標注數量(xml文件個數):2279 標注類別數:10 標注類別名稱:["yueyawan",&…

Qt 窗口隨鼠標移動效果

實現在窗口任意位置按下鼠標左鍵都可以移動窗口的效果&#xff0c;完整代碼如下&#xff1a; mainwindow.h&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class MainW…

PHP混淆加密以及常用的一些加密工具

PHP混淆加密是一種將源代碼轉換為難以理解和閱讀的方式&#xff0c;以保護代碼的安全性。以下是一些常見的PHP混淆加密方法&#xff1a; 代碼壓縮&#xff1a;使用代碼壓縮工具&#xff08;如UglifyJS&#xff09;將PHP代碼壓縮為一行&#xff0c;去除空格、換行符等可讀性的字…

jenkins 連接服務器,提示Can‘t connect to server

在Jenkins 添加服務器時&#xff0c;提示 Cant connect to server&#xff0c;如圖 搞了好久&#xff0c;不知道為什么不行~原來是行的&#xff0c;現在刪了 新建一個也不行。

2023牛客暑期多校訓練營8-C Clamped Sequence II

2023牛客暑期多校訓練營8-C Clamped Sequence II https://ac.nowcoder.com/acm/contest/57362/C 文章目錄 2023牛客暑期多校訓練營8-C Clamped Sequence II題意解題思路代碼 題意 解題思路 先考慮不加緊密度的情況&#xff0c;要支持單點修改&#xff0c;整體查詢&#xff0…

axios同一個接口,同時接收 文件 或者 數據

1、前端代碼 const service axios.create({baseURL: "http://192.168.2.200:8080/api",timeout: 180000 })// 響應攔截 service.interceptors.response.use(async response > {if(response){// 請求時設置返回blob, 但是實際上可能返回的是json的情況if (respon…

[C++]筆記 - 知識點積累

一.運算符的優先級 一共15個級別 最高優先級 : () []最低優先級 :逗號表達式倒數第二低優先級 : 賦值和符合賦值(,,-...) ! >算術運算符 > 關系運算符 > && >> || >賦值運算符 二.數據類型轉換 隱式類型轉換 算數轉換 char int long longlong flo…

解決Java中的“Unchecked cast: java.lang.Object to java.util.List”問題

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

搜索二叉樹

目錄 搜索二叉樹的性質 搜索二叉樹的實現、 插入 刪除 代碼 在以前我們學過二叉樹,但是在對二叉樹的學習中發現,似乎二叉樹并沒有什么作用,要論增刪它比不上鏈表,論隨機訪問也沒法和順序表比,對于當時的我們是一頭霧水,那么現在它的功能終于是體現出來了,這里就是我們要講的…

[Go版]算法通關村第十一關白銀——位運算的高頻算法題

目錄 專題1&#xff1a;位移的妙用題目&#xff1a;位1的個數&#xff08;也被稱為漢明重量&#xff09;解法1&#xff1a;遍歷所有位&#xff0c;判斷每個位的數字是否是1Go代碼 解法2&#xff1a;依次消除每個1的位 numnum&(num-1)Go代碼 題目&#xff1a;比特位計數思路…

Mac 卸載appium

安裝了最新版的appium 2.0.1,使用中各種問題&#xff0c;卡頓....,最終決定回退的。記錄下卸載的過程 1.打開終端應用程序 2.卸載全局安裝的 Appium 運行以下命令以卸載全局安裝的 Appium&#xff1a; npm uninstall -g appium 出現報錯&#xff1a;Error: EACCES: permiss…

云安全攻防(十二)之 手動搭建 K8S 環境搭建

手動搭建 K8S 環境搭建 首先前期我們準備好三臺 Centos7 機器&#xff0c;配置如下&#xff1a; 主機名IP系統版本k8s-master192.168.41.141Centos7k8s-node1192.168.41.142Centos7k8s-node2192.168.41.143Centos7 前期準備 首先在三臺機器上都執行如下的命令 # 關閉防火墻…

Python讀取Word統計詞頻輸出到Excel

1.安裝依賴的包 "# 讀取docx\n", "!pip install python-docx\n", "!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx\n", "# 中英文分詞\n", "!pip install jieba\n", "!pi…

postman測試后端增刪改查

目錄 一、本文介紹 二、準備工作 &#xff08;一&#xff09;新建測試 &#xff08;二&#xff09;默認url路徑查看方法 三、增刪改查 &#xff08;一&#xff09;查詢全部 &#xff08;二&#xff09;增加數據 &#xff08;三&#xff09;刪除數據 &#xff08;四&…

nginx反向代理流程

一、nginx反向代理流程 反向代理&#xff1a;使用代理服務器來接受internet上的連接請求&#xff0c;然后將請求轉發給內部網絡中的上游服務器&#xff0c;并將上游服務器得到的結果返回給請求連接的客戶端&#xff0c;代理服務器對外表現就是一個web服務器。Nginx就經常拿來做…