乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      實(shí)例7:用Python操作Word批量生成合同

       Four兄 2019-08-25

      我們?cè)趯?shí)例5中演示了如何用Python批量生成word版邀請(qǐng)函。我們是簡(jiǎn)單粗暴地找到需要填寫受邀者信息所在位置(即run),然后將這個(gè)run直接替換成受邀者的公司名及姓名。因?yàn)橹挥幸惶幮枰鎿Q,所以這個(gè)方法行得通,但遇到合同,一般有十來處需要修改,如果也逐個(gè)去找其位置所在的run,那就反而會(huì)降低我們的工作效率,背離辦公自動(dòng)化的初衷了。實(shí)例5可以作為入門python-docx模塊的練手項(xiàng)目。


      對(duì)于合同的批量處理,我們將使用更聰明的辦法。我們的思路是,先建立一個(gè)word模板,在合同里面需要變動(dòng)信息的地方用“【....】”來代替,比如“【合同編號(hào)】”等。然后再建一個(gè)Excel文檔,將“【合同編號(hào)】”等信息作為標(biāo)題,將不同的合同信息放入這個(gè)Excel的每一行。然后用python-docx去讀取word模板中的所有內(nèi)容,凡是遇到“【....】”的字符,就用Excel中的對(duì)應(yīng)標(biāo)題下的信息去進(jìn)行替換。Excel中從第二行開始每一行代表一個(gè)合同內(nèi)需要填入的信息。


      我們建立的模板和合同信息如下圖所示: 

      這里有幾個(gè)注意事項(xiàng):

      1. Excel文檔中數(shù)字需要改成文本格式,不然像合同編號(hào)20190401在寫入到word時(shí)會(huì)變成20190401.0。至于怎么轉(zhuǎn)格式,請(qǐng)參考度娘:jingyan.baidu.com/artic

      2. Excel中的公式需要去除,不然填到word中的信息是公式,而不是值。

      3. Word模板中的“【....】”和Excel中的標(biāo)題必須一一對(duì)應(yīng),且必須是全中文或全英文字符,因?yàn)?code>python-docx會(huì)將中英混合的內(nèi)容視為兩個(gè)及以上的格式(run),導(dǎo)致在替換的時(shí)候無法正確識(shí)別。

      4. Word模板做好后,要用python-docx讀取一下,看看“【....】”是不是一個(gè)獨(dú)立的run,若不是,則需要從Excel標(biāo)題欄中重新復(fù)制,覆蓋word模板中的“【....】”信息,已保證這一串字符是一個(gè)run。

      import docx #導(dǎo)入docx庫
      doc = Document('data/合同模板.docx') #打開word文件
      for para in doc.paragraphs: #讀取word中的每個(gè)段落
      for run in para.runs: #讀取每個(gè)段落中的不同格式(run)
      print(run.text)
      >>
      合同編號(hào):
      【合同編號(hào)】

      【貨物名稱】
      采購
      合同
      甲方

      【采購方】

      乙方
      -------省略----------

      通過以上程序,我們打印顯示了合同里面的所有的格式(其中每一行代表一個(gè)格式(run))對(duì)應(yīng)的文本(text),我們可以看到“【....】”都是在一行里面的,這樣就沒問題。由于word版合同里還有一些是在表格里面的,通過doc.paragraphs是無法抓取出來的,此時(shí)需要用doc.tables,表格(tables)里面又包含行(rows),行還包含單元格(cell),所以需要讀取所有的表格,然后讀取所有的行,再讀取單元格,并打印顯示出來??梢?“【....】” 也是在一行里面的,這樣可保證后續(xù)替換時(shí)可查找到,不會(huì)導(dǎo)致遺漏。

      for table in doc.tables:
      for row in table.rows:
      for cell in row.cells:
      print(cell.text)
      >>
      甲方(蓋章):【采購方】

      法人代表:
      或委托代理人:

      開戶行: 【開戶行】
      號(hào):【賬號(hào)】
      聯(lián)系人:【聯(lián)系人】
      話:【電話】
      所:【住所】

      乙方(蓋章):ABC商貿(mào)有限公司

      法人代表:
      或委托代理人:

      開戶行:中國建設(shè)銀行
      號(hào):989898989898
      聯(lián)系人:張三豐
      話:999-99999
      所: 桃花源

      Word模板做好后,“【....】”內(nèi)的信息就不可隨意變動(dòng)了,即便我們將“【合同編號(hào)】”里面的“遍”字刪掉重新輸入,結(jié)果還是“【合同編號(hào)】”,但此時(shí)“【合同編號(hào)】”已經(jīng)不是一個(gè)格式了,會(huì)變成2個(gè)格式。如下示例顯示了這個(gè)結(jié)果,“【合同編號(hào)】”已經(jīng)不在同一行了。所以這個(gè)格式非常小氣,不可輕易得罪?。〈藭r(shí)需要重新去Excel標(biāo)題欄復(fù)制【合同編號(hào)】,再粘貼過去,保存,即可恢復(fù)同一格式(也可以在word中復(fù)制“【合同編號(hào)】”,覆蓋粘貼成文本)。

      doc = Document('data\合同模板 - 需填入部分格式錯(cuò)誤.docx') #打開word文件
      for para in doc.paragraphs: #讀取word中的每個(gè)段落
      for run in para.runs: #讀取每個(gè)段落中的不同格式(run)
      print(run.text)
      >>合同編號(hào):
      【合同編
      號(hào)】

      【貨物名稱】
      采購
      合同
      甲方

      【采購方】

      此實(shí)例雖然是采購合同,其處理方法適用于所有合同的批量生成,只需要準(zhǔn)備好合同的模板,和需要填入合同的信息,剩下的就放心地交給Python吧。合同信息和模板準(zhǔn)備好之后,就可開始批量替換,生成合同了。現(xiàn)在跟我出發(fā)。

      import docx
      def info_update(doc,old_info, new_info):
      '''此函數(shù)用于批量替換合同中需要替換的信息
      doc:合同模板
      old_info和new_info:原文字和需要替換的新文字
      '''
      #讀取段落中的所有run,找到需替換的信息進(jìn)行替換
      for para in doc.paragraphs: #
      for run in para.runs:
      run.text = run.text.replace(old_info, new_info) #替換信息
      #讀取表格中的所有單元格,找到需替換的信息進(jìn)行替換
      for table in doc.tables:
      for row in table.rows:
      for cell in row.cells:
      cell.text = cell.text.replace(old_info, new_info) #替換信息

      為方便后續(xù)重復(fù)調(diào)用,以上我們定義了一個(gè)函數(shù)info_update(),它包含三個(gè)參數(shù)doc,old_info, new_info,分別代表word模板,原文本,和新文本。逐個(gè)讀取word模板中的所有信息,只要遇到原文本,就替換成新文本。然后再讀取word中的表格中的信息,也是遇到原文本,就替換成新文本。

      from openpyxl import load_workbook #用于讀取Excel中的信息
      wb = load_workbook('data/合同信息.xlsx')
      ws = wb.active
      doc = docx.Document('data/合同模板.docx')
      for row in range(2, ws.max_row+1):
      for col in range(1, ws.max_column+1):
      #調(diào)用上面建立的函數(shù),替換信息
      info_update(doc,str(ws.cell(row=1,column=col).value), str(ws.cell(row=row,column=col).value))
      doc.save('data/{}合同.docx'.format(str(ws.cell(row=row,column=3).value)))
      print('{}合同完成'.format(str(ws.cell(row=row,column=3).value)))
      >>
      公司001合同完成
      公司002合同完成
      公司003合同完成
      公司004合同完成
      公司005合同完成
      公司006合同完成
      公司007合同完成
      公司008合同完成
      公司009合同完成
      公司010合同完成

      然后使用“openpyxl”庫的“l(fā)oad_workbook”模塊,讀物Excel檔的合同信息,遍歷每一行,每一列,調(diào)用替換信息的函數(shù)“info_update”完成合同信息替換,隨后保存。


      我們以第一份合同為例,逐個(gè)看這些步驟是如何完成的。因?yàn)镋xcel中第一行是標(biāo)題,合同信息是從第二行開始的,所以我們行是從2開始row in range(2, ws.max_row+1),最大行加1結(jié)束(因?yàn)閞ange函數(shù)是取不到最后一個(gè)數(shù)的,此例中最大行是11,如果不加1,則只能取到10,這樣最后一份合同就會(huì)被漏掉了)。列也類似,不過是從第一列開始的col in range(1, ws.max_column+1)


      第一份合同對(duì)應(yīng)的row值為2,col值為1。原信息是Excel中的標(biāo)題,對(duì)應(yīng)也就是word中的“【....】”部分。次數(shù)原信息先取ws.cell(row=1,column=1).value,即如下所示,為'【合同編號(hào)】'。因?yàn)镋xcel表中有一些數(shù)字,加上str()是為了轉(zhuǎn)換為字符串。

      新信息為ws.cell(row=2,column=2).value,如下所示。然后就將word中'【合同編號(hào)】'替換為'手機(jī)',再替換第二列,第三列.....直到替換完所有的列,于是第一份合同生成完成,我們使用doc.save保存。我們給保存的文件名加上公司名稱,以便于區(qū)分,公司名是Excel中第三列的值ws.cell(row=row,column=3).value。

      第一份合同完成后,回到for循環(huán),開始第二份合同的替換和保存,直到搞定所有合同。最終成果如下:

      所有源代碼和說明都在Jupyter notebook上完成,所用到的Excel 資料已上傳GitHub, 歡迎Fork或下載到本地隨意玩。。。轉(zhuǎn)載請(qǐng)注明出處,謝謝。
      GitHub鏈接:

      https://github.com/weidylan/Office_Automation_by_Using_Python

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多