pythonがword、excelファイルを読み書きしたときに出会った穴をまとめます


巨坑一:wordまたはexcelを新規作成する場合
プログラムを作成するとき、コマンドラインインタフェース、wordまたはexcelを新規作成するとき、何の問題もなく、どのように新規作成に成功するかという奇妙な現象に遭遇します.しかし、コードをexeファイルにパッケージ化し、誰でも使えるように準備していると、exeファイルを実行してもwordやexcelファイルをなかなか新規作成できないことに気づきます.「docx.opc.exceptions.PackageNotFoundError:Package not found at'C:UsersADMINI~1.PC-AppDataLocalTemp_MEI 49~1docxtemplatesdefault.docx」「ソースコードを読むことで、実際にpythonが呼び出した2つのモジュールは、wordドキュメントまたはexcelファイルを新規作成する際に、新規ではなく、wordドキュメントはモジュールディレクトリPython 36-32Libsite-packagesdocxtemplatesdefault.docxファイルを開いて、それを削除するなどの操作を行い、saveの場合は、別途保存するだけであることがわかりました.を選択し、wordドキュメントまたはexcelを新規作成する場合は、コマンドでテンプレートファイルがあるパスを補完します.テンプレートファイルをパッケージ化するexeファイルのパスにコピーしたほうがいいです.
doc = Document(os.path.join(os.getcwd(), 'default.docx')) 

Excelは同じです.現在の実行プログラムディレクトリのdefaultを開くという意味です.docxファイル.そして整列して添削などの操作を行い、saveのときはどこにでも保存したいのでdefaultには影響しません.docxファイル.
message3 = 'E:\  \  \\result\:'
path = message3.replace('\\','/')
os.chdir(path)
file_name='XXXXXXX      20180716-20180722.docx'
doc.save(file_name)  ##      。  ,    。

巨坑二:wordドキュメントのリストにデータを書くと、タイプが一致しないデータは現れません.
一般的に、wordドキュメントのリストに書き込む場合は、2 Dリストにデータを保存してから、リストのデータをwordのリストにaddしますが、add_run()関数は、データ型が一致しないデータを処理できません.たとえば、2 Dリストに文字、数値、add_run()関数は、データが反復しないことをエラーします.この場合、2 Dリストのデータstrをダウンコンバートするだけです.
def getXterday(n): 
    today = datetime.date.today() 
    nday = datetime.timedelta(days=n) 
    Xterday = today-nday  
    return Xterday

def test(day_num,day_ago):
    Att3 = [
        ['','DB1  ','','','','','','DB2  ','','','','',''],
        ['','CpuUse','CpuSys','MemoryUse','    (       )','    KB/S','    Package/S', \
         'CpuUse','CpuSys','MemoryUse','    (       )','    KB/S','    Package/S'],
        ]

    for i in range(day_num):
        tmp = str(getXterday(day_ago-i)).replace('-','')
        Att3.append( tmp.split() + data['db1'+ tmp] + data['db2'+ tmp] )

    table3 = doc.add_table(rows=2+day_num,cols=13,style='Table Grid')

    for i in range(len(table3.rows)):
        heading_cells = table3.rows[i].cells       #            
        for j in range(len(heading_cells)):       #cols      
            p = heading_cells[j].paragraphs[0]    #          

            #####################################
            ##!!    !!      ,  Attr3         ,      ,   float,          ,      str   
            #####################################
            run = p.add_run(str(Att3[i][j]))      #            ,      

            run.font.name = '  '            #      
            run.font.size = Pt(6)                #      
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'),'  ')
            p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER   #    ,