Excelをドラッグ&ドロップでBOMなし・UTF-8・LFのCSVに変換するPythonスクリプト

Excelのシートは表を作成するのに大変便利で、日本の会社におけるExcel利用の99%がExcelの持てるパワーの99%を持て余した、関数が一つも入っていない表の作成に使われています(俺調べ)。

かく言う私も、趣味プログラマー活動でデータベースのデータを用意するときに、Excelで表を作ってCSVにしてからテーブルに投入ということをよくやります。

Excel標準CSV変換機能のダメポイント

ExcelからCSVへの変換は標準搭載の「名前を付けて保存」が一番簡単にできますが、これで出力したファイルが何の問題もなく使えた試しはありません。

そうです。原因はここへたどり着いた皆さんは百も承知のBOMの存在です。BOM付きCSVはWindows内だけで回すならいいですが、Linux系のシステムに投入すると120%コケます。

Excel単体でBOMなしUTF-8のCSVを出力しようとすると、今のところVBAに頼るしかなさそうな感じです。CSVが必要になった都度、VBAコードをコピペして実行するのはダルいので、もっと簡単にやりたいです。ここはPython先生に出張っていただきましょう。

ソースコード

全然難しいことはしないので、8割方AI先生に書いていただき、ところどころ編集したソースコードは次の通りです。せっかくなので、改行コードをLFにしてよりLinuxに寄せます。

import os
import sys
import openpyxl as excel
import csv

fp = sys.argv[1]
wb = excel.open(fp, data_only=True)
ws = wb.worksheets[0]
cd = os.path.dirname(fp)
fn = os.path.splitext(os.path.basename(fp))[0]

with open(os.path.join(cd, f'{fn}.csv'), 'w', newline='', encoding='utf8') as f:
    writer = csv.writer(f, lineterminator='\n')
    for row in ws.rows:
        writer.writerow([cell.value for cell in row])

使用方法

当然ですが、Python実行環境が必要です。その他にopenpyxlモジュールが必要です。なければインストールします。

pip install openpyxl

1.このページのダウンロードボタンからスクリプトファイルを入手するか、ソースコードをテキストファイルにコピペして拡張子.pywで保存します。

2.CSVに変換したいExcelファイルを対象シートを一番左にした状態でスクリプトファイルへドラッグ&ドロップします。

3.Excelファイルと同じフォルダにCSVファイルができます。

BOMなし・UTF-8・LFで保存されています。

ヘッダーを区別しないで全行含まれますので、必要なければあらかじめ消しておくか、ソースコードを書き換えて、除外するようにしてご利用ください。

ご承知かと思いますが、できたCSVをExcel等のWindowsベッタリのソフトウェアで開くと日本語が文字化けして読めなくなっています。

スクリプトファイルを入手する

利用上のご注意

  • ダウンロードしたファイルを利用したことにより生じた結果については、利用者ご自身に責任を負っていただきます。
  • ご利用前に使用方法をご確認ください。
  • 当方は成果物の正確性について最善を尽くしますが保証はいたしません。
  • Windows11 Microsoft365 環境でのみ動作確認済み。

Downloadボタンを押下した時点で注意事項に同意したものとみなします。

excel_csv_utf8_lf_conv.zip

まとめ

BOMが何なのかはGoogle先生に聞いていただくとして、そもそもコイツが存在しなければ何の問題もないわけですが、今更廃止することはできないでしょう。Excelが標準でBOMなしUTF-8で保存できるオプションを用意してくれるまでは今回のスクリプトでやっつけるとします。たしか以前はUTF-8で保存することもできなかったはずですが、今はできるようになっているので少しは期待できるかな。

どうでもいい余談ですが、ExcelでBOMなしUTF-8を出力する方法を調べていてAI先生にVBAコードをお願いしたら、CreateObjectでインスタンスを作っているのに、プロパティに参照設定を付けていないと引けない列挙型の名前が平気で使われていて、コピペ実行したらエラー吐きまくりの使えないコードを提示されました。

おまえふざけんなよ、どんな学習しやがったんだと参照元のサイトを開いてみたら、そっちもそうでした。ちゃんちゃん。AIはコードを検証しているわけでもないし、正しいか間違っているかなんて知ったこっちゃないのを再認識。

おわり。