Python處理docx文檔

應(yīng)用場(chǎng)景:

根據(jù)數(shù)據(jù)源不同,處理tem.docx模板文檔驹吮,輸出目標(biāo)result.docx文檔。注意這里介紹的方法不適用*.doc 文檔

開發(fā)環(huán)境:

 1.windows7/windows10
 2.Python3.6+  64bit
 3.擴(kuò)展模塊:python-docx 

從擴(kuò)展模塊官方文檔描述來(lái)看DocxFactory似乎更符合我的需求,無(wú)奈我在win7和win10兩個(gè)環(huán)境里安裝都失敗沥匈,提示: Unable to find vcvarsall.bat,說(shuō)是需要Visual C++或者Visual Studio而我需要的版本分別為Visual C++ 14或者Visual Studio 2015忘渔,但是安裝之后并沒(méi)有解決問(wèn)題高帖。也曾嘗試在Centos7環(huán)境里安裝DocxFactory,仍然安裝失敗辨萍。所以只好放棄DocxFactory棋恼。

安裝擴(kuò)展模塊

pip install python-docx

或者

easy_install python-docx

關(guān)于python-docx的詳細(xì)信息返弹,請(qǐng)參閱官方文檔 http://python-docx.readthedocs.io/en/latest/

模板文檔

為了處理常用的文檔內(nèi)容,示例模板中包括普通的段落爪飘、表格义起、圖片、公式师崎。文檔內(nèi)容圖示默终,其中藍(lán)色字體為定義的參數(shù),輸出目標(biāo)文檔時(shí)會(huì)被動(dòng)態(tài)替換:


模板文檔內(nèi)容1.png
模板文檔內(nèi)容2.png

我想要的效果是文檔中的參數(shù)被替換成我想要的數(shù)據(jù)犁罩,文檔內(nèi)容格式保持齐蔽。

代碼內(nèi)容

模塊引入
import copy
import docx
import os
文檔處理代碼
def change_key(doc, new_doc, dic):
  if dic and doc and new_doc:
    doc_path = os.path.join(FILE_PATH, doc)
    new_doc_path = os.path.join(NEW_FILE_PATH, new_doc)
    doc_file = docx.Document(doc_path)
    # 替換段落內(nèi)容
    for paragraph in doc_file.paragraphs:
        # 深度復(fù)制段落內(nèi)容,包括樣式床估。如果不深度復(fù)制含滴,樣式會(huì)丟失
        list_runs = copy.deepcopy(paragraph.runs)
        paragraph.clear()
        #文字替換
        for run in list_runs:
            for name in dic:
                print (name)                
                if name in run.text:
                    value = dic[name]
                    run.text = run.text.replace(name, str(value))
            # 段落樣式的復(fù)制
            paragraph.add_run(run.text, run.style)

    # 替換表格內(nèi)容
    for table in doc_file.tables:
        # 深度復(fù)制表格內(nèi)容,包括樣式, 如果不深度復(fù)制丐巫,樣式會(huì)丟失
        table_style = copy.deepcopy(table.style)
        for row in table.rows:
            for cell in row.cells:
                for name in dic:
                    if name in cell.text:
                        value = dic[name]
                        cell.text = cell.text.replace(name, str(value))
        table.style=table_style
    doc_file.save(new_doc_path)
    print(new_doc_path)
else:
    return
測(cè)試代碼
value_dic = {
  "module_name": "python-docx",
  "bottom": "Sub_Bottom",
  "subscript_top": "Sub_Top",
  "rc_22": "TRC22",
  "rc_24": "TRC24",
  "rc_32": "TRC32",
  "rc_34": "TRC34",
}
change_key("tem.docx", "result.docx", value_dic)

對(duì)于python-docx來(lái)說(shuō)文檔中的所有內(nèi)容都是段落谈况,其識(shí)別段落是根據(jù)文檔中的回車符來(lái)判斷的。而對(duì)于文檔中的公式或者圖片來(lái)說(shuō)递胧,python-docx處理起來(lái)會(huì)丟失碑韵。python-docx在解析docx文檔時(shí)首先會(huì)解壓文檔,公式和圖片都會(huì)被作為圖片來(lái)處理缎脾,存放入“..\word\media\”目錄下祝闻,所以僅僅簡(jiǎn)單的復(fù)制是會(huì)因找不到而丟失這些內(nèi)容。我在模板文檔中對(duì)公式與圖片作了特殊處理遗菠,即在公式與圖片外面加了一層表格联喘,表格邊框線設(shè)置為無(wú)邊框,視覺(jué)效果上與普通的公式舷蒲、圖片沒(méi)有什么區(qū)別耸袜,但卻方便了很多。

輸出效果

目標(biāo)文檔效果1.png
目標(biāo)文檔效果2.png

從輸出結(jié)果來(lái)看牲平,還有一些不盡如意的地方堤框,比如原文檔中參數(shù)由藍(lán)色標(biāo)注,輸出后纵柿,顏色消失蜈抓;原來(lái)的斜體效果也失去;表格中動(dòng)態(tài)寫入的內(nèi)容也是左對(duì)齊昂儒,而原模板是居中設(shè)置的沟使。
這里記錄了自己踩過(guò)的坑調(diào)填平后的內(nèi)容,至于會(huì)遇到什么樣的坑渊跋,你不防自制一個(gè)模板來(lái)試試腊嗡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末着倾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子燕少,更是在濱河造成了極大的恐慌卡者,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客们,死亡現(xiàn)場(chǎng)離奇詭異崇决,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)底挫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門恒傻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人建邓,你說(shuō)我怎么就攤上這事盈厘。” “怎么了官边?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵扑庞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拒逮,道長(zhǎng),這世上最難降的妖魔是什么臀规? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任滩援,我火速辦了婚禮,結(jié)果婚禮上塔嬉,老公的妹妹穿的比我還像新娘玩徊。我一直安慰自己,他們只是感情好谨究,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布恩袱。 她就那樣靜靜地躺著,像睡著了一般胶哲。 火紅的嫁衣襯著肌膚如雪畔塔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天鸯屿,我揣著相機(jī)與錄音澈吨,去河邊找鬼。 笑死寄摆,一個(gè)胖子當(dāng)著我的面吹牛谅辣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婶恼,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼桑阶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柏副!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚣录,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤割择,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后包归,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锨推,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年公壤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了换可。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厦幅,死狀恐怖沾鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情确憨,我是刑警寧澤译荞,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站休弃,受9級(jí)特大地震影響吞歼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塔猾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一篙骡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丈甸,春花似錦糯俗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顿仇,卻和暖如春淘正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臼闻。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工跪帝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人些阅。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓伞剑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親市埋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黎泣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容