

Pythons初心者ですので、質問が不作法の場合ご容赦くださいませ。

## 環境

  * Windows 11
  * Pyhton 3.11.2
  * openpyxl 3.1.2

## 質問

  1. Pythonのコードで、エクセルで（ALT＋ENTER）で改行されているセルの値を改行なしに変換。
  2. 1.と同様にセル内に全角と半角のスペースを削除。
  3. セル内の値は左詰め。

問題点の指摘とコードの改善をご指導いただけますと幸甚です。

コードは以下の通りです。

[code]

    import openpyxl
    from tkinter import Tk
    from tkinter.filedialog import askopenfilename
    
    Tk().withdraw()
    filename = askopenfilename()
    
    wb = openpyxl.load_workbook(filename)
    ws = wb.active
    
    for row in ws.iter_rows():
        for cell in row:
            if cell.value and isinstance(cell.value, str): 
                print(repr(cell.value))
                cell.value = cell.value.replace('\n', '').replace('　', '').replace(' ', '')
                cell.alignment = openpyxl.styles.Alignment(horizontal='left')            
    
    new_filename = filename.replace('.xlsx', '-改行解除.xlsx')
    wb.save(new_filename)
    
[/code]


CC BY-SA 4.0
2023-03-20T23:37:58.173
94259
2023-03-23T03:11:21.880
2023-03-22T01:48:33.020
3060
57612
question
python python3 openpyxl
Excel のセル内の改行文字を Python のコードで削除したい


「（ALT＋ENTER）で改行されているセル」と同等の内容と思われるCSVファイルからExcelで変換して作成した.xlsxファイルに対して質問のスクリプトを実行すると、スクリプト中の`print(repr(cell.value))`の表示では`_x000D_`(もしくは`_x000D_\n`?)という文字列が入っています。

それで検索すると以下のような記事が見つかります。  
[エクセルファイルに _x000D_
という文字列が挿入されるトラブルと解決法](https://oshiete.goo.ne.jp/qa/11892517.html)  
[ディクレ サポートBBS - [TCARD for CE]](http://www.dicre.com/bbs/thread.php?tid=110)
の`11 2013/04/03 16:19:40`の欄  
[Access newline becoming
_x000D_](https://stackoverflow.com/q/36167807/9014308)  
[DURING EXCEL DATA IMPORT - LINE FEEDS CONVERTED TO
_X000D_](https://community.dynamics.com/365/sales/f/dynamics-365-for-sales-
forum/417694/during-excel-data-import---line-feeds-converted-to-_x000d_)

ちなみに最新版にアップデートしているMicrosoft 365
のExcelの操作として「（ALT＋ENTER）で改行」した際にはそれは入っていませんでしたし、質問のスクリプトで問題無く削除出来ていました。

ということで質問のスクリプトで処理できなかったのだとしたら、おそらくセル内の改行は`_x000D_`または`_x000D_\n`だと思われます。  
(上記紹介記事の2番目によると`_x001F_`もそうらしいですが)

なので、こちらの行にもう一つ置換処理を足して：

[code]

    cell.value = cell.value.replace('\n', '').replace('　', '').replace(' ', '')
    
[/code]

このようにしてみてはどうでしょう？(なお必要ならば`_x001F_`も追加)

[code]

    cell.value = cell.value.replace('_x000D_', '').replace('\n', '').replace('　', '').replace(' ', '')
    
[/code]


CC BY-SA 4.0
2023-03-21T14:13:01.033
94264
2023-03-22T03:30:10.757
2023-03-22T03:30:10.757
26370
26370
94259
answer


質問の仕方が悪かったのか、Chat-GPT4の調子が悪かったのかは判りませんが、  
先ほど以下コードで解決いたしましたので、取り急ぎご報告いたします。

[code]

    import os
    import re
    from openpyxl import load_workbook
    from openpyxl import Workbook
    from tkinter import Tk
    from tkinter.filedialog import askopenfilename
    from tkinter.filedialog import asksaveasfilename
    
    def remove_newlines_and_spaces(cell_value):
        cell_value = re.sub(r'\n', '', cell_value)
        cell_value = re.sub(r'　', '', cell_value)
        cell_value = re.sub(r' ', '', cell_value)
        return cell_value
    
    Tk().withdraw()
    file_path = askopenfilename(title="エクセルファイルを選択してください", filetypes=[("Excel files", "*.xlsx")])
    
    if file_path:
        wb = load_workbook(file_path)
        ws = wb.active
    
        for row in ws.iter_rows():
            for cell in row:
                if cell.value and isinstance(cell.value, str):
                    cell.value = remove_newlines_and_spaces(cell.value)
    
        save_path = asksaveasfilename(defaultextension=".xlsx", initialfile=os.path.splitext(os.path.basename(file_path))[0] + "-改行解除済", title="保存先を選択してください", filetypes=[("Excel files", "*.xlsx")])
    
        if save_path:
            wb.save(save_path)
            print("処理が完了しました。")
    else:
        print("ファイルが選択されませんでした。")
    
[/code]


CC BY-SA 4.0
2023-03-23T02:00:00.357
94279
2023-03-23T02:09:02.487
2023-03-23T02:09:02.487
3060
57612
94259
answer


既に解決済みですが、`remove_newlines_and_spaces()` 関数は不要で、二重ループの部分を以下の様に書き換えてもよいかと思います。

[code]

    for row in ws.iter_rows():
        for cell in row:
            if cell.value and isinstance(cell.value, str):
                cell.value = re.sub(r'[\n　 ]', '', cell_value)
    
[/code]


CC BY-SA 4.0
2023-03-23T03:11:21.880
94281
2023-03-23T03:11:21.880
47127
94259
answer