89258


Pythonで`Book1.xlsx`から1行ずつ値を取得します。  
行を取得後、D列`Book2.xlsx`へ貼り付けます。

`Book1.xlsx`

A | B | C  
---|---|---  
6月6日 | アメリカ | 15  
6月7日 | 日本 | 35  
6月8日 | スペイン | 45

[code]

    A,B,C
    6月6日,アメリカ,15
    6月7日,日本,35
    6月8日,スペイン,45
    
[/code]  
  
`Book2.xlsx`  
貼り付けたいエクセルのはヘッダーがないエクセルなので、openpyxlを使っています。  
また行番号もないので、B列に入っている日付をキーにしてD列に値を貼り付けたいです。

TEST_DATA |  |  |  
---|---|---|---  
| A | B | C  
| 6月4日 | カナダ | 1  
| 6月5日 | イギリス | 109  
| 6月6日 | アメリカ |  
| 6月7日 | 日本 |  
| 6月8日 | スペイン |

[code]

    TEST_DATA,,,,
    ,A,B,C,
    ,6月4日,カナダ,1
    ,6月5日,イギリス,109
    ,6月6日,アメリカ,
    ,6月7日,日本,
    ,6月8日,スペイン,
    
[/code]  
  
実現したい内容  
Book1.xlsxのC列からBook2.xlsxのD列に値を貼り付けたいです。  
ただA列日付はシリアル値になっていますので、現在は下記のコードで行っています。

`Book2.xlsx`

TEST_DATA |  |  |  
---|---|---|---  
| A | B | C  
| 6月4日 | カナダ | 1  
| 6月5日 | イギリス | 109  
| 6月6日 | アメリカ | 15  
| 6月7日 | 日本 | 35  
| 6月8日 | スペイン | 45  
  
現在は下記の方法で行っていますが、毎回手動で値を変更しいますので  
全自動で`Book1.xlsx`から範囲を読み込み`Book2.xlsx`へ貼り付け可能でしょうか。

実現する方法がありましたら、ご教示いただけますと幸いです。

お手数ですが、よろしくお願い致します。

[code]

    from openpyxl import load_workbook
    #ファイル名
    Book1=r"C:\Users\test\Desktop\Book1.xlsx"
    wb = load_workbook(Book1)
    #シート指定
    ws = wb['Sheet1']
    
    #Book1の２行目を読み込み　
    for row in ws.iter_cols():
        for cell in row:
            if cell.row == 2:
                print(cell.value)
    
    #出力結果
    # 44718
    # アメリカ
    # 15
    
    #ファイル名
    Book2=r"C:\Users\test\Desktop\Book2.xlsx"
    wb = load_workbook(Book2)
    #シート指定
    ws = wb['Sheet1']
    
    #貼り付ける際にキーを基準にしたい列
    target_col = "B"
    #貼り付ける列
    next_col = "D"
    
    #シリアル値　2022/6/6
    #日付をヒットする文字
    target_string = "44718" 
    
    #1行ずつ読み込み該当のE列エクセルへ貼り付け
    for row in range(2, ws.max_row+1):
        if target_string in str(ws[f"{target_col}{row}"].value):
            ws[f"{next_col}{row}"] = 15
    
    #ファイル保存       
    wb.save(Book2)
    
[/code]


CC BY-SA 4.0
2022-06-06T04:53:12.010
89252
2022-06-07T04:49:50.027
2022-06-06T09:18:26.680
18859
18859
question
python python3
Python（openpyxl）にてexcelの任意の値を貼り付け方法


「貼り付けたいエクセルのはヘッダーがないエクセルなので、openpyxlを使っています。」と書かれていますが、`header=None`を指定すれば`pandas`の`read_excel()`でも問題無く読めます。  
書き込む際も`to_excel()`で`index=False`,`header=False`を指定すれば良いでしょう。

以下のようにすれば少ない処理で出来ます。  
ファイルのパス指定や`Book2.xlsx`の列名、列番号等はそれぞれ相応しいものに変えてください。

[code]

    import pandas as pd
    
    df1 = pd.read_excel('Book1.xlsx')
    df2 = pd.read_excel('Book2.xlsx', header=None, names=['Title','A','B','C'])
    
    for i, e in df1.iterrows():
        df2.iat[(df2.index[(df2.A == e.A)].tolist()[0]), 3] = e.C
    
    df2.to_excel('Book2.xlsx', index=False, header=False)
    
[/code]

* * *

「ただ日付はシリアル値44716として保存されます。pandasで変換可能でしょうか。」に関して

一応以下の記事を応用すれば`pandas`で日付シリアル値を変換出来そうですが、これを実際のDataFrameにどう適用するかでとても複雑になりそうです。  
[Date serial number and date need to convert in date
format](https://stackoverflow.com/q/58191555/9014308)

> base on my experience the origin in Excel is December 30, 1899.

>
[code]

>
> s1=pd.to_datetime(pd.to_numeric(df.date,errors='coerce'),errors='coerce',origin='1899-12-30',unit='D')
>  
[/code]

なので、質問記事のソースコードと以下の記事を応用して、結果のExcelファイルに対して`openpyxl`で書式設定を行うのが簡単だと思われます。  
[日時 - PythonでExcel操作【openpyxl -
日付、通貨、日時のフォーマットを制御する】](https://qiita.com/matsuyamasyou/items/36d8d7eaf5a7dcb986a2#%E6%97%A5%E6%99%82)

>
[code]

>     sheet["B1"].number_format = "yyyy年mm月dd日"
>  
[/code]

以下のように出来るでしょう。

[code]

    from openpyxl import load_workbook
    wb = load_workbook('Book2.xlsx')
    ws = wb['Sheet1']
    
    date_col = 'B'
    for row in range(2, ws.max_row+1):
        ws[f"{date_col}{row}"].number_format = 'm月d日'
    
    wb.save('Book2.xlsx')
    
[/code]


CC BY-SA 4.0
2022-06-06T14:02:51.137
89258
2022-06-07T04:49:50.027
2022-06-07T04:49:50.027
26370
26370
89252
answer