質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1054閲覧

[Python・PysimpleGUI] Wordの語句置換がうまくいかない

Rance1119

総合スコア2

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/03/12 14:31

質問

現在プログラミングを学び中です。
WordとExcelの変換アプリを作りたいのですが下記のコードだとWordの語句変換のみ置換成功のメッセージは出るものの、Wordファイルを確認すると置換されていません。Excelの方は問題なしです。
ライブラリがインストールされているか、デモプログラムを確認したりしましたが原因が分からず困っています。
解決策をご教授ください。### ヘディングのテキスト
宜しくお願い致します。

該当のソースコード

Python

1import glob 2import os 3import openpyxl 4import time 5import PySimpleGUI as sg 6import docx 7 8# 対象ファイル種別 9fileType = ['*.xlsx'] # openpyxlは、[*.xls]拡張子に非対応 10fileType_docx = ['*.docx'] # docxファイルのみ対応 11 12# logic 置換処理 13def exe_strchange(File_path_str, Before_str, After_str): 14 15 start = time.perf_counter() # 実行時間計測開始 16 17 #「対象フォルダのパス」配下にあるExcelファイルのパスを出力 18 list_path_file = [] 19 for ext in fileType: 20 # サブフォルダまで検索可能 21 list_path_file.extend(glob.glob(os.path.join(File_path_str + r'/**/',ext), recursive=True)) 22 23 #「対象フォルダのパス」配下にあるWordファイルのパスを出力 24 list_path_file_docx = [] 25 for ext in fileType_docx: 26 # サブフォルダまで検索可能 27 list_path_file_docx.extend(glob.glob(os.path.join(File_path_str + r'/**/',ext), recursive=True)) 28 29 print('◆検索対象ファイル数:' + str(len(list_path_file))) 30 31 # 各ファイル数カウント 32 total_count = 0 #変換総数 33 book_count = 0 #Excel変換数 34 doc_count = 0 #Word変換数 35 36 # ------------------ 37 # Excelファイル数分ループ 38 # ------------------ 39 for book in list_path_file: 40 print("■対象ファイル: " + book) 41 bookFlg=0 42 #ブックの取得 43 #openpyxl.load_workbook('Excelファイルのパス') 44 actBook = openpyxl.load_workbook(book) 45 46 #シート数分ループ 47 for actSheetName in actBook.sheetnames: 48 print("■対象シート"+ actSheetName) 49 count = 0 50 51 #アクティブシートを取得 #ブック変数[シート名] 52 actSheet = actBook[actSheetName] 53 54 # userdrange範囲内のセルに対して文字列の一致したセルを置換する 55 for row in actSheet.iter_rows(min_row=actSheet.min_row,max_row=actSheet.max_row,min_col=actSheet.min_column,max_col=actSheet.max_column): 56 # if any(is_empty(c) for c in row): 57 # continue 58 for cell in row: 59 if str(cell.value) in Before_str: 60 cell.value = After_str 61 count+=1 62 bookFlg=1 63 64 print(str(count) + "件置換しました。") 65 66 #ブックを保存 67 if bookFlg == 1: 68 total_count+=1 69 book_count+=1 70 #ブック変数.save(Excelファイルのパス) 71 actBook.save(book) 72 # elapsed_time_file = time.perf_counter() - start 73 # print("1ファイル処理時間(elapsed_time):{0}".format(elapsed_time_file) + "[sec]") 74 75 else: 76 actBook.close 77 78 # ------------------ 79 # wordファイル数分ループ 80 # ------------------ 81 for document in list_path_file_docx: 82 print("■対象ファイル: " + document) 83 doxcFlg=0 84 #docxの取得 85 #openpyxl.load_workbook('ファイルのパス') 86 actdoc = docx.Document(document) 87 count = 0 88 # userdrange範囲内のセルに対して文字列の一致したセルを置換する 89 for para in actdoc.paragraphs: 90 # if any(is_empty(c) for c in row): 91 # continue 92 93 if para.text in Before_str: 94 para.text.replace(Before_str, After_str) 95 count+=1 96 doxcFlg=1 97 98 print(str(count) + "件置換しました。") 99 100 #ファイルを保存 101 if doxcFlg == 1: 102 total_count+=1 103 doc_count+=1 104 #保存: docx変数.save(ファイルのパス) 105 actdoc.save(document) 106 107 else: 108 actdoc.close 109 110 # 経過時間 111 elapsed_time = time.perf_counter() - start 112 113 result_str_list = [ 114 '検索対象Excelファイル数:' + str(len(list_path_file)), '変換Excelファイル数:' + str(book_count), 115 '検索対象Wordファイル数:' + str(len(list_path_file_docx)), '変換Wordファイル数:' + str(doc_count), 116 '変換ファイル総数:' + str(total_count),'Total処理時間:{0}'.format(elapsed_time) + '[sec]'] 117 118 return result_str_list 119 120 121def main(): 122 sg.theme('Blue Mono') 123 layout = [[sg.Text('指定フォルダ内のサブフォルダ対応')], 124 [sg.Text('FolderPath:'), sg.Input(size=(56,1), key='-IN_File-')], 125 [sg.Text('置換前(検索値):'), sg.Input(size=(50,1), key='-IN_Before-')], 126 [sg.Text('置換後(変換値):'), sg.Input(size=(50,1), key='-IN_After-')], 127 [sg.Button('実行', bind_return_key=True)] 128 ] 129 130 window = sg.Window('Excel&word 文字列置換ツール', layout) #GUIウィンドウ設定 131 132 event, values = window.read(close=True) 133 if event == sg.WIN_CLOSED: 134 window.close() 135 if event == '実行': 136 # 画面テキスト入力内容取得 137 File_path_str = values['-IN_File-'] 138 Before_str = str(values['-IN_Before-']) 139 After_str = str(values['-IN_After-']) 140 141 # logic関数実行 142 result_str =exe_strchange(File_path_str, Before_str, After_str) 143 144 # 結果表示 145 sg.popup_scrolled('完了!\n' + result_str[0] + '\n' + result_str[1] + '\n' + result_str[2] + '\n' + result_str[4] + '\n' + result_str[5]) 146 147 window.close() 148 149if __name__ == '__main__': 150 main() 151 152 153

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

para.text = para.text.replace(~のように置換結果を代入する必要があります。
また、これは要件しだいですが
文書中の「あいうえお」の「あいう」部分を「かきく」に置換して「かきくえお」としたいのであれば
if Before_str in para.text:のほうが正しいです。

投稿2023/03/12 15:08

can110

総合スコア38260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問