【初心者歓迎】Python でExcelをCSVファイルに変換しよう

例えば、EXCELでもらったデータを別のアプリに読み込ませるため、CSVに変換したいということはありませんか?

今回は、Excel で保存されている一覧形式のデータをCSVファイルに変換する、「ExcelシートCSV変換ツール」を紹介します。

シートごとにCSVファイルを作成するのはもちろんのこと、全てのシートから抜き出したデータを1つのCSVファイルにまとめる(結合する)ことにも対応しています。

EXCELからCSVファイルに出力する処理は関数化しているため、ご自身のプログラムにコピペして簡単に利用できます。

EXCELからCSVファイルを出力したいとお悩みのあなた、是非この記事を参考にしてください。

自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。

目次

ExcelシートCSV変換ツールの概要

今回紹介するExcel⇒CSV抽出ツールには、次の特徴があります。

  • 指定したフォルダにあるEXCELファイルを、まとめてCSVファイルに変換します。
  • ワイルドカードを指定することで、特定のEXCELファイルだけを変換できます。
  • EXCELファイルに複数シートが保存されている場合、シート単位にCSVファイルを作成します。
  • 変換後のCSVファイルを1つのCSVにまとめることができます。
  • 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。

ExcelシートCSV変換ツールの使い方

画面項目の説明

画面項目説明
EXCEL保存先フォルダCSVに変換したいEXCELファイルが保存されたフォルダのパス
ワイルドカードの指定EXCEL保存先フォルダ内のEXCELファイルから、変換したいものを選択するためのワイルドカード
CSV出力先フォルダ変換後のCSVファイルの保存先フォルダのパス
CSVファイルの結合指示CSV出力フォルダ内のCSVファイルを1つのファイルに結合するか否かを指定するスイッチ
EXCELシートCSV変換ボタン変換処理の実行

CSVファイル変換の手順

  • 変換したいEXCELファイルが保存されているフォルダを指定します。
  • 必要に応じて、ワイルドカーを指定します。
  • 変換後のCSVファイルを保存するフォルダを選択します。
  • 「CSVに出力する」ボタンをクリックします。

出力されるCSVファイルの命名規則について

CSVファイルの名前は、ファイル名_シート名.CSV という命名規則で作成されます。
例えば、hoge.xlsx に sheet1,sheet2 という2つのシートが格納されている場合、次の名前でCSVファイルが作成されます。

hoge_sheet1.csv
hoge_sheet2.csv

全てのCSVファイルの結合について

CSV出力先フォルダに存在する全てのCSVが mearge.csv という名前で結合されます。直前の処理でCSVファイルが残っていた場合、それらも一緒に結合されるのでご注意ください。

プログラムのダウンロードと動作環境の設定

STEP
Pythonのインストール

事前に、Pythonのインストールが必要です。まだ環境構築が済んでいない方は、下記の記事を参考に構築してください。

自作ツールのためのポータブルPython開発・実行環境を作ろう!プログラム実行時に必要
WinPythonにVSCode Portable版を入れよう!プログラム修正時に必要
STEP
ライブラリのインストール

Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。

pip install customtkinter
pip install tkinterdnd2

STEP
ソースコードのダウンロードと展開

ExcelシートCSV変換ツールと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。

実行方法

次の手順で実行してください。

  • WinPython のインストールフォルダ内にある command.bat を実行
  • ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
  • Python main.py を実行

Python main.py

しばらくすると下記の画面が表示されます。ワイルドカード以外は空白で表示されますので、必要な箇所を入力してください。尚、ワイルドカードのみ、前回の変更内容を保存しないようにしています。

実行すると、コマンドプロンプトに変換されたCSVファイル名が表示されます。

ExcelシートCSV変換ツールの仕様

プログラムの構成

main.py の中で画面の表示と「CSVに出力する」ボタンのイベント処理を記述しています。イベント処理の中でexcell2csv.pyを呼び出し、EXCEL⇒CSV変換処理やCSV結合処理を行っています。

モジュール名役割
main.py画面の表示とボタンクリックのイベント処理
excel2csv.pyEXCELからCSVファイルへの変換、CSVファイルの結合処理
create_ui.pyUI定義ファイルを読み込み、記述されたウィジェットを画面表示
customtkinterファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助
appconfig.py画面に入力された値をJson形式のファイルに保存/読込する

ソースコード

main.py

UI画面の表示と「CSVに出力する」ボタンの処理が記述されています。

       
import os
import sys
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
from excel2csv import export_sheets_to_csv,get_files,join_csv


# ボタンが押された時の処理
def func(param):
    files = get_files(os.path.join(param["input_folder"],param["_wildcard_entry"]))
    for file in files:
        export_sheets_to_csv(file,param["output_folder"])

    if param["merge_switch"]:
        files = get_files(param["output_folder"])
        join_csv(files,os.path.join(param["output_folder"],"merge.csv"))

# インスタンス生成
ui = CreateUI(func)

# 画面の表示
ui.show()

excel2csv.py

このファイルには、次の3つの関数が含まれています。 

関数名説明
get_files(
folder, #フォルダのパス 
recursive, #再帰的に取得するかどうかのフラグ
include_hidden # 隠しファイルを含めるかどうかのフラグ 
)
指定されたフォルダ内のファイルを再帰的に取得する。
戻り値としてファイルパスの一覧をリスト形式で返す。 
join_csv(
csv_files, #結合するCSVファイルのリスト
output_file, #結合後に保存する出力ファイルのパス
encoding #CSVファイルのエンコーディング(初期値:'shift-jis')
)
指定されたCSVファイルを1つに結合し、指定した出力ファイルに保存する。
最初のCSVファイルからヘッダを取得し、以降はヘッダを無視して結合する。
export_sheets_to_csv(
excel_file, #読み込むExcelファイルのパス
output_folder, # CSVファイルを出力するフォルダ 
csv_encoding #出力CSVファイルの文字コード (初期値:'shift-jis')
)
Excelファイルの各シートを個別のCSVファイルとして出力する。
CSVファイル名は、元のファイル名_シート名で自動生成される。
#pip install openpyxl
import os
import pandas as pd
import glob

def get_files(folder,recursive=False,include_hidden=False):
    """
    指定されたフォルダ内のファイルを再帰的に取得する関数
    :param folder: フォルダのパス
    :param recursive: 再帰的に取得するかどうかのフラグ
    :param include_hidden: 隠しファイルを含めるかどうかのフラグ
    :return: ファイルのリスト
    """
    if os.path.isdir(folder):
        folder = os.path.join(folder,"*")
    if recursive:
        dir,name = os.path.split(folder)
        folder = os.path.join(dir,"**",name)
    return glob.glob(folder,recursive=recursive,include_hidden=include_hidden)

def join_csv(csv_files,output_file,encoding="shift-jis"):
    """
    指定されたCSVファイルを1つに結合し、指定した出力ファイルに保存する関数。
    最初のCSVファイルはすべてのデータを読み込み、以降のファイルはデータ部分のみを追記します。

    :param csv_files: 結合するCSVファイルのリスト(ファイルパスのリスト)
    :param output_file: 結合後に保存する出力ファイルのパス
    :param encoding: CSVファイルのエンコーディング(デフォルトは 'shift-jis')
    """
    if os.path.isfile(output_file):
        os.remove(output_file)

    for i, csv_file in enumerate(csv_files):  
        # ファイルをデータフレームに読み込む
        if i == 0:
            # 最初のファイルは全てのデータを読み込み
            df = pd.read_csv(csv_file, encoding=encoding)
            df.to_csv(output_file, index=False, mode='w', header=True, encoding=encoding)
        else:
            # 2つ目以降のファイルはデータ部分のみを追記
            df = pd.read_csv(csv_file, encoding=encoding)
            df.to_csv(output_file, index=False, mode='a', header=False, encoding=encoding)
    

def export_sheets_to_csv(excel_file, output_folder, csv_encoding="shift-jis"):
    """
    Excelファイルの各シートを個別のCSVファイルとして出力する関数。
    
    :param excel_file: 読み込むExcelファイルのパス
    :param output_folder: CSVファイルを出力するフォルダ
    :param csv_encoding: 出力CSVファイルの文字コード(デフォルト: 'shift-jis')
    """
    # Excelファイル名(拡張子を除く)を取得
    base_filename = os.path.splitext(os.path.basename(excel_file))[0]
    
    # 出力フォルダが存在しない場合は作成
    os.makedirs(output_folder, exist_ok=True)
    
    # Excelファイルを読み込む
    xls = pd.ExcelFile(excel_file, engine="openpyxl")  # engine指定は必要に応じて変更
    
    # シートごとにデータフレームに変換してCSVに出力
    for sheet_name in xls.sheet_names:
        # シートをデータフレームに読み込む
        df = pd.read_excel(xls, sheet_name=sheet_name)
        
        # 全ての列がNaNの行(空白行)を削除
        df = df.dropna(how="all")
        
        # CSVファイル名を作成
        csv_filename = f"{base_filename}_{sheet_name}.csv"
        csv_path = os.path.join(output_folder, csv_filename)
        
        # データフレームをCSVに出力
        df.to_csv(csv_path, index=False, encoding=csv_encoding)
        print(f"Saved: {csv_path}")

design.txt

title:EXCELシートCSV変換
mode:light
max:1024,350
size:600,350
min:600,350
input_folder:EXCELファイルを格納しているフォルダ,フォルダ選択
{
    label:ワイルドカード
    _wildcard_entry:400,*.xlsx
}
output_folder:CSV出力先フォルダ,フォルダ選択
{
    merge_switch:出力フォルダにある全てのCSVを結合し、merge.csv という名前で保存する
}
extract_button:CSVに出力する

design.txt の記述方法については、下記の記事で詳しく解説しています。

あわせて読みたい
【CustomTkinter】テキスト記述でGUIを簡単作成するライブラリを紹介! 本ブログで紹介しているツールも含め、自作ツールはちょっとした作業を自動化することが目的なので、簡易的な画面で事足りることが大半です。 とはいうものの、CustomTk...

まとめ

今回は、「ExcelシートCSV変換ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。

指定したフォルダに置かれたEXCELファイルに対して、「ファイル名_シート名.csv」という命名規則でシート単位にCSV変換する機能と、それらを1つのCSVファイルに結合する機能を用意しました。

CSV変換処理とCSV結合処理は、再利用しやすいように関数化もしています。

もし、ご自身の作業でEXCELファイルからCSVファイルを取り出す必要性が生じたら、是非この記事をご活用下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次