pythonがword、excelファイルを読み書きしたときに出会った穴をまとめます
5354 ワード
巨坑一: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ファイルのパスにコピーしたほうがいいです.
Excelは同じです.現在の実行プログラムディレクトリのdefaultを開くという意味です.docxファイル.そして整列して添削などの操作を行い、saveのときはどこにでも保存したいのでdefaultには影響しません.docxファイル.
巨坑二:wordドキュメントのリストにデータを書くと、タイプが一致しないデータは現れません.
一般的に、wordドキュメントのリストに書き込む場合は、2 Dリストにデータを保存してから、リストのデータをwordのリストにaddしますが、add_run()関数は、データ型が一致しないデータを処理できません.たとえば、2 Dリストに文字、数値、add_run()関数は、データが反復しないことをエラーします.この場合、2 Dリストのデータstrをダウンコンバートするだけです.
プログラムを作成するとき、コマンドラインインタフェース、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 # ,