csvから、excel自動入力(csv使って)


<h3>入れたいdata  : 単発バイト給料 + 面接交通費
</h3>

![スクリーンショット 2025-03-27 1.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/1ea09712-1771-4fe4-9951-2fc0bca83ecf.png)

![スクリーンショット 2025-03-27 1.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/231ca582-e32f-423b-aa3f-5c4fec22c626.png)


<br>
<h3>用意するもん</h3>

```ruby: ✅ 
meisai.csv
train.csv
sam明.xlsx
```

<br>
<h3>sam明.xlsx中身</h3>

![スクリーンショット 2025-03-27 1.08.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7e59163d-7c81-4ae2-a10f-bf198d7e6f18.png)


<br>
<h3>やり方 1️⃣</h3>

```ruby: データを入れたい行を決め、行を指定
# 5行目からデータ入れる
start_row = 5
for i, row in enumerate(meisai_data, start=5):

# 17行目からデータ入れる
start_row = 17
for i, row in enumerate(train_data, start=17):
```

<br>
<h3>やり方  2️⃣</h3>

```ruby: 列を指定 
    [ 1. dataが "14,コンビニ,梅屋敷→生麦,6418,456" なら]
    ws[f'A{start_row}'] = row[0]  # 日付
    ws[f'B{start_row}'] = row[1]  # 勤務先
    ws[f'C{start_row}'] = row[2]  # 経路
    ws[f'D{start_row}'] = row[3]  # 交通費(往復)
    ws[f'E{start_row}'] = row[4]  # 給料
    start_row += 1 


    [ 2. dataが "21,大森→恵比寿,460" なら]
    ws[f'A{start_row}'] = row[0]  # 日付
    ws[f'B{start_row}'] = row[1]  # 経路             ws[f'C{start_row}'] = row[2]  # 交通費
    start_row += 1
```


<br>
<h3>データがちゃんと入力できてるかチェック</h3>

```ruby: ✅ 
start_row = ５
for i, row in enumerate(meisai_data, start=5):
    print(f"書き込み予定: {i}行目 → {row}")
    ※処理
    print(f"meisai_data のデータ数: {len(meisai_data)}")
```
<h3>チェック出力結果</h3>

![スクリーンショット 2025-03-27 1.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/cf096a6d-a6ab-4e08-a2dc-ee885e3937e9.png)


<br>
<h3>csvファイル読み込み</h3>

```ruby: ✅
def read_csv_file(file_name):
    data = []
    with open(file_name, newline="", encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        next(reader)  # ヘッダーをスキップ
        for row in reader:
            row = [cell.strip() if cell else '' for cell in row]  # Noneを空文字に変換
            if any(row):  # 1つでもデータが入っていれば追加
                data.append(row)
    return data

# CSVデータを読み込む
meisai_data = read_csv_file('meisai.csv')
train_data = read_csv_file('train.csv')
```

<br>
<h4>excelF3の数式 自動コピペ</h4>

```ruby:
from openpyxl.formula.translate import Translator

  ws[f'F{start_row}'] = Translator(ws["F3"].value, origin="F3").translate_formula(f"F{start_row}")

```

<h4>数式 自動コピペ</h4>

```ruby:
from openpyxl.formula.translate import Translator

  ws[f'F{start_row}'] = Translator(ws["コピペしたい数式があるセル"].value, origin="コピペしたい数式があるセル").translate_formula(f"F{start_row}")

```

<br>
<h3>code全文</h3>

```ruby:☑️
import csv
from openpyxl import load_workbook

# CSVファイルの読み込み
def read_csv_file(file_name):
    data = []
    with open(file_name, newline="", encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        next(reader)  # ヘッダーをスキップ
        for row in reader:
            row = [cell.strip() if cell else '' for cell in row]  # Noneを空文字に変換
            if any(row):  # 1つでもデータが入っていれば追加
                data.append(row)
    return data

# CSVデータを読み込む
meisai_data = read_csv_file('meisai.csv')
train_data = read_csv_file('train.csv')

# Excelファイルを開く
wb = load_workbook('sam明.xlsx')
ws = wb["シート1"]

# meisai.csvのデータをA5から書き込む
start_row = 5
for i, row in enumerate(meisai_data, start=5):
    print(f"書き込み予定: {i}行目 → {row}")

    # 必要なデータが揃っている場合のみ書き込む
    ws[f'A{start_row}'] = row[0]  # 日付
    ws[f'B{start_row}'] = row[1]  # 勤務先
    ws[f'C{start_row}'] = row[2]  # 経路
    ws[f'D{start_row}'] = row[3]  # 交通費(往復)
    ws[f'E{start_row}'] = row[4]  # 給料
    start_row += 1  # 次の行に進む
    print(f"meisai_data のデータ数: {len(meisai_data)}")

# train.csvのデータをA17から書き込む
start_row = 17
for i, row in enumerate(train_data, start=17):
    print(f"書き込み予定: {i}行目 → {row}")
        ws[f'A{start_row}'] = row[0]  # 日付
        ws[f'B{start_row}'] = row[1]  # 経路
        ws[f'C{start_row}'] = row[2]  # 交通費
        start_row += 1  # 次の行に進む
        print(f"train_data のデータ数: {len(train_data)}")

# Excelファイルを保存
wb.save('sam明.xlsx')
```

<br>
<h4>コピペしたい合計の数式があるが、一回目のみ、数式コピペしない</h4>

```ruby:
first_formula = ws['G3'].value
```

<br>
<h4>セルG4から、合計関数コピペ</h4>

```ruby:
    for row in range(4, ws.max_row + 1):
        ws[f'G{row}'] = f'={first_formula[1:]}{row}'
```

<h2>解説後</h2>

```ruby:
start  列 、end  行 で調べてる

df.loc[end, start] 
→ 行 "新橋"  & 列 "大森"の値（例: 378）取得

取得dataを "交通費(往復)" のセル（D{start_row}）に代入

列 に "大森", "渋谷" ある？
行 に "新橋", "原宿" ある?


for start, end in zip(start_stations, end_stations):
start_stations と end_stations から「出発駅」 /「到着駅」を2つ同時に取り出す」
💡 zip() 、2つのリストを 同時に1つずつ取り出せる


if start in df.columns and end in df.index:
start（出発駅）が 列にあり、end（到着駅）が 行にあるか？」チェック
df.columns → 列（カラム名）のリスト
df.index → 行（インデックス）のリスト

```

<h4>サンプル</h4>

```ruby:
start_stations = ["大森", "渋谷", "池袋"]
end_stations = ["新橋", "新宿", "品川"]

for start, end in zip(start_stations, end_stations):
    print(start, end)

    結果
      大森 新橋
      渋谷 新宿
      池袋 品川
```

<h4>サンプル2</h4>

```ruby:
    df がこんな形なら👇
        大森	渋谷	池袋
    新橋	378	420	500
    新宿	300	350	450
    品川	250	270	320

   df.columns → ["大森", "渋谷", "池袋"]
   df.index → ["新橋", "新宿", "品川"]
    
    例えば start = "大森", end = "新橋" なら
    "大森" in df.columns → ✅（ある）
    "新橋" in df.index → ✅（ある）
    → 処理続行！

    start = "横浜" 
    "横浜" in df.columns → ❌（ない）
    if の中に入らずスキップされる。
```