自動化辦公系列1---doc文件內(nèi)容替換

項(xiàng)目下載github

一、開始之前的準(zhǔn)備工作:

環(huán)境:操作系統(tǒng)win10,python2.7.15,開發(fā)軟件為pycharm社區(qū)版

問題1:如何在pycharm中切換python版本。

原因:現(xiàn)在有些模塊支持的Python版本不一樣,所以在開發(fā)時(shí)經(jīng)常需要切換版本來開發(fā)。

1、點(diǎn)擊file->setting

setting設(shè)置

2、切換需要的環(huán)境

選擇Python環(huán)境

注意:選擇環(huán)境前必須安裝了對應(yīng)的python版本,并且添加到環(huán)境變量中。


添加到用戶環(huán)境變量

問題2:如何給不同版本的python導(dǎo)入對應(yīng)的模塊。

導(dǎo)入模塊一般兩種方式:

1、使用pycharm來導(dǎo)入(推薦)

點(diǎn)擊圖中+號

搜索想要添加的模塊即可

2、使用cmd的pip install xxx 命令方式。

二、開始doc或者docx的替換操作

需求:我需要把文件夾下的所有docx文件即一整套模板,中的某些字符進(jìn)行替換,然后生成填完后的文件。
參考之前寫的:http://www.itdecent.cn/p/95bbb29ce3a9

1、創(chuàng)建py文件的時(shí)候注意,2.7.15版本默認(rèn)編碼格式不是utf-8,而我們一般操作字符都是以utf-8的方式,故需要添加一些代碼把編碼格式轉(zhuǎn)為utf-8。python3之后默認(rèn)格式都是utf-8了。

在文件開頭添加如下代碼:

#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

2、操作docx文件需要導(dǎo)入的模塊

2.1、python-docx (操作docx文件)
看模塊名就知道該模塊只能處理docx不能處理doc
2.2、pywin32 (方便Python調(diào)用windows的API)

from docx import Document
from docx.shared import Pt #磅數(shù)
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #導(dǎo)入doc轉(zhuǎn)docx

3、開始編寫腳本

#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from docx import Document
from docx.shared import Pt #磅數(shù)
from docx.oxml.ns import qn #chinese
import os
from win32com import client as wc #導(dǎo)入doc轉(zhuǎn)docx

#找到文件夾下的所有doxc文件并獲得文件名
def file_name(file_dir):
    for root,dirs,files in os.walk(file_dir):
        return files

#遍歷剛才找到的所有文件夾然后替換關(guān)鍵字
def change_text(old_text, new_text,document):
    all_paragraphs = document.paragraphs
    for paragraph in all_paragraphs:
        for run in paragraph.runs:
            if old_text in run.text:
                run.text = run.text.replace(old_text, new_text)

    all_tables = document.tables
    for table in all_tables:
        for row in table.rows:
            for cell in row.cells:
                for paragraph in cell.paragraphs:
                    for run in paragraph.runs:
                        if old_text in run.text:
                            run.text = run.text.replace(old_text, new_text)

#把doc文件轉(zhuǎn)為docx文件
def doc_to_docx(file1,file2):
    word = wc.Dispatch("Word.Application") # 打開word應(yīng)用程序
    doc = word.Documents.Open(file1)       #打開word文件
    doc.SaveAs("{}x".format(file2), 12)    #另存為后綴為".docx"的文件,其中參數(shù)12指docx文件
    doc.Close()                            #關(guān)閉原來word文件
    word.Quit()
    return "{}x".format(file)              #返回的是一個(gè)file對象或者文件名稱

#把docx文件轉(zhuǎn)為doc文件
def docx_to_doc(file1,file2):
    word = wc.Dispatch("Word.Application") # 打開word應(yīng)用程序
    doc = word.Documents.Open(file1)       #打開word文件
    doc.SaveAs("{}".format(file2[:-1]), 0) #另存為后綴為".docx"的文件,其中參數(shù)12指docx文件
    doc.Close()                            #關(guān)閉原來word文件
    word.Quit()
    return "{}x".format(file)  #返回的是一個(gè)file對象或者文件名稱

#進(jìn)行批量替換并生成新文件
#第一個(gè)參數(shù)傳入模板文件夾路徑,第二個(gè)參數(shù)導(dǎo)出結(jié)果到某個(gè)文件夾路徑(請寫絕對路徑)
def deal_task(importPath,exportPath):
    words = file_name(importPath)   #獲取所有文件的文件名
    for words_name in words:
        print words_name            #打印獲取的文件名查看是否有錯(cuò)誤
        #只有后綴為docx的文件可以繼續(xù)執(zhí)行
        if words_name.find('.docx') != -1:
            #PackageNotFoundError,捕獲一下該異常
            try:
                document = Document(importPath+'/'+words_name)        #讀取當(dāng)前遍歷的文件
                document.styles['Normal'].font.name = u"仿宋_GB2312"
                document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u"仿宋_GB2312")
                document.styles['Normal'].font.size = Pt(12)
                #進(jìn)行替換操作
                #old_text和new_text都是動態(tài)傳入
                #遍歷entry_list和entry_str來執(zhí)行動態(tài)操作,偶是old奇數(shù)是new
                for num in range(0,len(entry_list)-1,2):
                    #輸入框任一一欄沒有輸入內(nèi)容不會執(zhí)行替換操作
                    if entry_list[num] != '' and entry_list[num+1] != '':
                        change_text(entry_list[num].strip(),entry_list[num+1].strip(),document)
                        print 'old_text: ' + entry_list[num]
                        print 'new_next: ' + entry_list[num+1]
                document.save(exportPath+"/"+"auto"+words_name)   #默認(rèn)存儲為auto+原文件名的方式
            except Exception as e:
                print '打開docx文件失敗'
                print e
    print "完成!"

#進(jìn)行批量轉(zhuǎn)換并生成轉(zhuǎn)換后的文件到文件夾內(nèi)
#第一個(gè)參數(shù)導(dǎo)入的路徑,第二個(gè)是導(dǎo)出的路徑
def docTodocx(importPath,exportPath):
    fileNames = file_name(importPath)  # 獲得所有文件名
    # filePath = importPath
    for fileName in fileNames:         # 遍歷文件夾下的所有文件
        # 先判斷是否有doc然后再判斷docx,只要不是doc直接跳過
        # fileName = fileName.decode('gb2312').encode('utf-8')
        if fileName.find('doc') != -1:
            print '進(jìn)入doc處理循環(huán)'
            file1 = importPath + "/" + fileName
            print 'file1:' + file1
            file1 = file1.decode('utf-8').encode('gb2312')
            # print 'gb2312編碼的file1: ' + file1
            file2 = exportPath + "/" + fileName
            print 'file2:' + file2
            file2 = file2.decode('utf-8').encode('gb2312')
            doc_to_docx(file1, file2)

#設(shè)定自己要替換的數(shù)組第一個(gè)是old_text,第二個(gè)是new_text依次次類推
entry_list = ["X1","2021","X2","2022"]

if __name__ == "__main__":
    #如果模板全是docx只需要調(diào)用deal_task()函數(shù)就行了,不是的話先調(diào)用docTodocx轉(zhuǎn)為docx

    #第一步把doc轉(zhuǎn)為docx
    docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
    deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")

注意:這里docTodocx()和docxTodoc()就是對應(yīng)doc文件轉(zhuǎn)docx和docx轉(zhuǎn)doc。程序這里只使用docTodocx()函數(shù)。

4、使用方式

新建三個(gè)文件夾
1exportPath(存放結(jié)果)
2importPath(存放模板)
3temporary(存放臨時(shí)模板如經(jīng)過轉(zhuǎn)換得到的docx)


文件夾

然后開始執(zhí)行腳本,即可實(shí)現(xiàn)批量替換模板中的文字。如我這里只用兩個(gè)文件作為演示
展示操作步驟:
1、準(zhǔn)備將1.docx和2.docx文件內(nèi)的X1和X2分別替換成2021和2022


1.docx

2.docx

2、打開腳本進(jìn)行操作

#設(shè)定自己要替換的數(shù)組第一個(gè)是old_text,第二個(gè)是new_text依次次類推
entry_list = ["X1","2021","X2","2022"]

if __name__ == "__main__":
    #如果模板全是docx只需要調(diào)用deal_task()函數(shù)就行了,不是的話先調(diào)用docTodocx轉(zhuǎn)為docx

    #第一步把doc轉(zhuǎn)為docx
    docTodocx("I:/pythonProject1/docx_operation/importPath","I:/pythonProject1/docx_operation/temporary")
    deal_task("I:/pythonProject1/docx_operation/temporary","I:/pythonProject1/docx_operation/exportPath")

注意:把絕對路徑中的反斜杠改成斜桿/
3、控制臺會顯示要替換的內(nèi)容和替換的內(nèi)容


顯示完成即可.png

4、查看文件是否生成且替換成功


生成

auto1.docx.png

auto2.docx.png

使用的注意事項(xiàng):

1、復(fù)制代碼然后安按照規(guī)則填入路徑在win10,python2.7.15下可正常運(yùn)行,寫之前自己測試過沒問題。
2、要替換的字符串必須只能是數(shù)字加字母之前文章中也提過。
3、替換的時(shí)候必須關(guān)閉WPS或者word軟件,因?yàn)槌绦蜻\(yùn)行時(shí)候需要打開對應(yīng)的軟件進(jìn)行操作。
4、文件名或者路徑有中文的時(shí)候控臺會亂碼,程序是可以正常執(zhí)行的。原因是windows中的中文一般編碼都是gbk或者gb2312,控制臺只能顯示utf-8。

注:轉(zhuǎn)載請注明出處
本文如果對你有幫助的話希望能給我點(diǎn)個(gè)贊哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容