2
3

More than 3 years have passed since last update.

大量のexcelをマージして1つのexcelにするpython

Last updated at Posted at 2020-06-19

30ファイルに及ぶ設定ファイルがexcelで、全て別ファイルとして丁寧に送られてきたので
一つ一つ開くのは基本的人権の侵害に当たると思い、pythonさんにやってもらった記録です。

作戦

エクセルを1つのフォルダにすべてぶっこみ、同フォルダにpythonを一つ作って、
all.xlsx というファイルの1シート目に内容をすべて記載する。

実践

ファイル配置

.
├── all.xlsx         # 最終的に出来上がるエクセル
├── excel_merge.py   # 今回作るpythonちゃん
├── site-packages    # 利用するパッケージが入っている。今回使うのはnumpyだけ。
│   ├── bin
│   ├── numpy
│   └── numpy-1.18.5.dist-info
├── hogehoge1.xlsx   # 丁寧に送られてきた大量のexcel様
├── hogehoge2.xlsx
・・・
└── hogehoge30.xlsx

numpyをインストール

pip install numpy -t site-packages/

-t でフォルダ名を指定すると、その場にファイルを展開してインストールしてくれます。

excel_merge.pyを作る

こんな感じのソースを書いて保存しましょう

import os, sys, glob
sys.path.append(os.path.join(os.path.dirname(__file__), 'site-packages'))
import openpyxl as px

NEW_FILE = "all.xlsx"

# エクセルのファイルを全て取得する
files = glob.glob("./*.xls*")

all_data = []
for f in files:
    # 開いているexcelがあったら無視。all.xlsxがあっても無視。
    if f.startswith('./~')  or f == NEW_FILE:
        continue
    # excelを開いて頂く
    wb=px.load_workbook(f, data_only=True)
    # シートを開いて頂く
    ws = wb.worksheets[0]
    # シートを読み込んで全行取得して頂く
    for row in ws.iter_rows(min_row=2):
        # 不要な行があったら飛ばす。
        if row[0].value is None or \
            not str(row[0].value).strip() or \
            row[1].value is None or \
            row[0].value == 'nanika zyogai sitai mozi':
            continue
        values = []
        # 全セルを舐め回してデータを取得する
        for col in row:
            values.append(col.value)
        # 全セルデータを一つの配列に保存する
        all_data.append(values)

# ここからall.xlsxを作る作業
# print(all_data)
wb = px.Workbook()
ws = wb.worksheets[0]
start_row = 2
start_col = 3
# 全セルデータを順番に書き込み
for y, row in enumerate(all_data):
    for x, cell in enumerate(row):
        ws.cell(row=start_row + y,
                    column=start_col + x,
                    value=all_data[y][x])

#名前を付けて保存
wb.save(NEW_FILE)
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3