Python操作Word一括生成契約の実施例


背景:約3 Kのメーカーが情報を再確認して契約を結ぶ必要があります。契約書は統一されたWord版です。各サプライヤーは契約内の金額部分を修正する必要があります。人工的に処理するには、複製ごとに貼り付けられ、金額は大文字の金額を生成する必要があります。重複作業に基づいてサボることができます。Pythonで救出してください。

#       
import numpy as np 
import pandas as pd 
import os 
import docx
from docx.shared import Pt
from docx.oxml.ns import qn
#        
os.chdir(r'C:\Users\WIN7\Desktop\       ')
os.getcwd()


'''
          
'''
# coding: utf-8
import warnings
from decimal import Decimal

def cncurrency(value, capital=True, prefix=False, classical=None):
  '''
    :
  capital:  True        
        False       
  classical: True   
        False  
  prefix:   True   '   '  
        False,    
  '''
  if not isinstance(value, (Decimal, str, int)):
    msg = '''
             ,        ,   decimal.Decimal  。
                               。
    '''
    warnings.warn(msg, UserWarning)
  #         ,        
  if classical is None:
    classical = True if capital else False
    
  #       
  if prefix is True:
    prefix = '   '
  else:
    prefix = ''
    
  #         
  dunit = (' ', ' ')
  if capital:
    num = (' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ')
    iunit = [None, ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
  else:
    num = ('', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ')
    iunit = [None, ' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
  if classical:
    iunit[0] = ' ' if classical else ' '
  #    Decimal,       

  if not isinstance(value, Decimal):
    value = Decimal(value).quantize(Decimal('0.01'))

  #     
  if value < 0:
    prefix += ' '     #     ,  
    value = - value     #      ,           
                # assert - value + value == 0
  #       
  s = str(value)
  if len(s) > 19:
    raise ValueError('     ,        。')
  istr, dstr = s.split('.')      #              
  istr = istr[::-1]          #          
  so = []   #         
  
  #  
  if value == 0:
    return prefix + num[0] + iunit[0]
  haszero = False   #         
  if dstr == '00':
    haszero = True #        ,      ,    “   ”
    
  #       
  #  
  if dstr[1] != '0':
    so.append(dunit[1])
    so.append(num[int(dstr[1])])
  else:
    so.append(' ')     #   ,  “ ”
  #  
  if dstr[0] != '0':
    so.append(dunit[0])
    so.append(num[int(dstr[0])])
  elif dstr[1] != '0':
    so.append(num[0])    #     ,  “ ”
    haszero = True     #       
    
  #      
  if istr == '0':
    if haszero:       #        ,          
      so.pop()
    so.append(prefix)    #    
    so.reverse()      #   
    return ''.join(so)

  #       
  for i, n in enumerate(istr):
    n = int(n)
    if i % 4 == 0:     #   、 、    ,    ,      
      if i == 8 and so[-1] == iunit[4]:  #             
        so.pop()            #    
      so.append(iunit[i])
      if n == 0:             #            
        if not haszero:         #          
          so.insert(-1, num[0])    #         
          haszero = True       #       
      else:                #         
        so.append(num[n])
        haszero = False         #            
    else:                  #       
      if n != 0:             #       
        so.append(iunit[i])
        so.append(num[n])
        haszero = False         #            
      else:                #        
        if not haszero:         #          
          so.append(num[0])
          haszero = True

  #     
  so.append(prefix)
  so.reverse()
  return ''.join(so)

#           
#      EXCEL  
text = pd.read_excel('     .xlsx')
#print(text)
text['EC    ']
list1 = []
for i in text['EC    ']:
  list1.append(cncurrency(str(i)))
text.append(list1)
text['    '] = list1
text.shape[0]
print(text.head())

document12 = docx.Document('  SPM  (12 ).docx')
document24 = docx.Document('  SPM  (24 ).docx')
supp_num = 0 
for supp_num in range(text.shape[0]):
  paragraph_num = 0
  A = text.iat[supp_num,2]
  B = text.iat[supp_num,5]
  qishu = text.iat[supp_num,3]
  supp_name = text.iat[supp_num,1]
  user_name = text.iat[supp_num,4]
  content = "    ,    2020   3   31  ,               (         、  、  、    )、    、    、               ,                {} (  :{})。".format(A,B)
  if qishu == "12 ":
    p = document12.paragraphs[8].clear()
    run1 = p.add_run(content)
    run1.font.size = Pt(12)
    run1.font.name = '  '
    run1.element.rPr.rFonts.set(qn('w:eastAsia'), '  ')
    document12.save("{}.docx".format(supp_name))
  else:
    p = document24.paragraphs[8].clear()
    run1 = p.add_run(content)
    run1.font.size = Pt(12)
    run1.font.name = '  '
    run1.element.rPr.rFonts.set(qn('w:eastAsia'), '  ')
    document24.save("{}.docx".format(supp_name))
主に四つのプレートに分けます。
 一:関連のカバンを導入します。これは言いません。
 二:数字の金額が大文字になる金額。このネット上にある既製の関数は自分で書かなくてもいいです。Copyテストしてください。OKです。
 自分のデータを用意します。
 指定された位置の内容を交替したいですが、作業が難しいことが分かりました。それでは拡大して、直接に段落を交替します。formatを使って、必要な内容を直接記入します。そしてdocxで中を包んでください。clear【クリア段落】にadd_を入れます。run【段落を追加する】方式で、フォントサイズとフォントサイズを調整します。最後にsaveはOJBKです。
ここでPython操作Wordの量産契約の実施例についての記事を紹介します。Pythonの大量交換ワードの内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。