例えば、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ファイルが残っていた場合、それらも一緒に結合されるのでご注意ください。
プログラムのダウンロードと動作環境の設定
事前に、Pythonのインストールが必要です。まだ環境構築が済んでいない方は、下記の記事を参考に構築してください。
自作ツールのためのポータブルPython開発・実行環境を作ろう! | プログラム実行時に必要 |
WinPythonにVSCode Portable版を入れよう! | プログラム修正時に必要 |
Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。
pip install customtkinter
pip install tkinterdnd2
ExcelシートCSV変換ツールと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。
ExcelシートCSV変換ツール
実行方法
次の手順で実行してください。
- WinPython のインストールフォルダ内にある command.bat を実行
- ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
- Python main.py を実行
Python main.py
しばらくすると下記の画面が表示されます。ワイルドカード以外は空白で表示されますので、必要な箇所を入力してください。尚、ワイルドカードのみ、前回の変更内容を保存しないようにしています。
実行すると、コマンドプロンプトに変換されたCSVファイル名が表示されます。
ExcelシートCSV変換ツールの仕様
プログラムの構成
main.py の中で画面の表示と「CSVに出力する」ボタンのイベント処理を記述しています。イベント処理の中でexcell2csv.pyを呼び出し、EXCEL⇒CSV変換処理やCSV結合処理を行っています。
モジュール名 | 役割 |
---|---|
main.py | 画面の表示とボタンクリックのイベント処理 |
excel2csv.py | EXCELからCSVファイルへの変換、CSVファイルの結合処理 |
create_ui.py | UI定義ファイルを読み込み、記述されたウィジェットを画面表示 |
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 の記述方法については、下記の記事で詳しく解説しています。
まとめ
今回は、「ExcelシートCSV変換ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。
指定したフォルダに置かれたEXCELファイルに対して、「ファイル名_シート名.csv」という命名規則でシート単位にCSV変換する機能と、それらを1つのCSVファイルに結合する機能を用意しました。
CSV変換処理とCSV結合処理は、再利用しやすいように関数化もしています。
もし、ご自身の作業でEXCELファイルからCSVファイルを取り出す必要性が生じたら、是非この記事をご活用下さい。
コメント