Excel ファイル(.xlsx/.xls)を CSV 形式に変換する作業は、データ分析やシステム間のデータ連携において頻繁に発生します。データベースへのインポート、スクリプトによるバッチ処理、あるいは異なるアプリケーション間でのデータ受け渡しなど、CSV 形式が求められる場面は多岐にわたります。
Python を使ってこの変換を自動化することで、手作業によるミスを減らし、処理の効率を高めることが可能です。この記事では、Spire.XLS for Python というライブラリを用いた変換手順を、具体的なコード例とともに解説します。
Spire.XLS for Python の概要
Spire.XLS for Python は、Python 環境から Excel ファイルの読み込み、作成、編集、変換を行うためのライブラリです。.NET 向けに開発された Spire.XLS を Python から利用できるようにしたもので、以下のような操作が可能です。
- Excel ワークブックの読み込みと新規作成
- セルデータの読み取りと書き込み
- 数式や書式の設定
- グラフや画像の操作
- PDF、CSV、HTML、画像などの各種形式への変換
- Windows、Linux、macOS での動作
このライブラリには無料版と有料版があります。無料版ではシートあたりの行数や列数に上限が設けられています。大規模なファイルを扱う場合は、事前に公式の制限事項を確認する必要があります。
環境の準備
Spire.XLS for Python は PyPI に登録されており、以下のコマンドでインストールできます。
pip install Spire.XLS
インストールが完了したら、Python スクリプト内で必要なクラスをインポートして使用します。
from spire.xls import Workbook
from spire.xls import FileFormat
Excel を CSV に変換する基本手順
Spire.XLS for Python で Excel を CSV に変換する基本的な流れは次のとおりです。
-
Workbookオブジェクトを作成し、Excel ファイルを読み込む -
SaveToFileメソッドでCSV形式を指定して保存する -
Disposeメソッドでリソースを解放する
ワークブックのアクティブシートをCSVに変換する
以下のコードは、Excel ファイルのアクティブシート(通常は先頭シート)を CSV として保存する例です。
from spire.xls import Workbook
from spire.xls import FileFormat
# Workbookオブジェクトの作成
workbook = Workbook()
# Excel ファイルの読み込み
workbook.LoadFromFile("data.xlsx")
# CSV 形式で保存(アクティブシートが対象)
workbook.SaveToFile("output.csv", FileFormat.CSV)
# リソースの解放
workbook.Dispose()
FileFormat.CSV は、ファイル形式を CSV として指定する列挙値です。このメソッドではアクティブシートのみが変換対象となります。
特定のワークシートをCSVに変換する
ワークブックに複数のシートが含まれており、特定のシートだけをCSVに変換したい場合は、Worksheet オブジェクトの SaveToFile メソッドを使用します。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 2 番目のワークシートを取得(インデックスは0から)
worksheet = workbook.Worksheets[1]
worksheet.SaveToFile("sheet2.csv", ",")
workbook.Dispose()
Worksheet.SaveToFile メソッドの第2引数には、区切り文字を指定します。通常の CSV であればカンマ(,)、タブ区切りであればタブ文字(\t)を指定します。
すべてのワークシートを個別の CSV ファイルに変換する
ワークブック内の全シートを、それぞれ個別の CSV ファイルとして保存するには、以下のようにループ処理を行います。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 全ワークシートをループ
for i in range(workbook.Worksheets.Count):
worksheet = workbook.Worksheets[i]
# シート名をファイル名に使用(ファイル名に使えない文字は置換)
safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
output_filename = f"{safe_name}.csv"
worksheet.SaveToFile(output_filename, ",")
workbook.Dispose()
シート名にファイル名として使用できない文字(/や\など)が含まれている場合を考慮し、置換処理を追加しています。環境によっては他の文字も置換対象となります。
CSV 変換時の留意点
区切り文字の指定
日本ではカンマ区切りの CSV が一般的ですが、データによってはタブ区切り(TSV)やセミコロン区切りが適している場合もあります。SaveToFile メソッドの第 2 引数で任意の区切り文字を指定できます。
# タブ区切りで保存
worksheet.SaveToFile("output.tsv", "\t")
出力される文字コード
SaveToFile メソッドで出力される CSV ファイルの文字コードは、既定では UTF-8(BOM なし)です。日本語環境で Microsoft Excel を使って CSV を開くと、文字化けが発生する場合があります。これは Excel が BOM なし UTF-8 を正しく判別できないことに起因します。
以下のように、出力後に文字コードを Shift-JIS に変換する後処理を行う方法があります。
# UTF-8 で出力後、Shift-JIS に変換する例
worksheet.SaveToFile("temp.csv", ",")
# UTF-8 で読み込み、Shift-JIS で書き出し
with open("temp.csv", "r", encoding="utf-8") as f:
content = f.read()
with open("output_sjis.csv", "w", encoding="shift_jis") as f:
f.write(content)
この方法はライブラリ自体の機能ではなく、Python の標準機能を併用したものです。出力された CSV ファイルの文字コードを要件に合わせて調整する必要がある場合は、このようなアプローチを検討します。
値にカンマや改行が含まれる場合の処理
CSV 形式では、セル内にカンマやダブルクォーテーション、改行が含まれる場合、適切にエスケープ処理が行われないとデータが崩れます。Spire.XLS for Python の SaveToFile メソッドは、セル値にカンマや改行が含まれる場合、自動的に値をダブルクォーテーションで囲み、ダブルクォーテーション自体は2重にエスケープする処理を行います。この動作はRFC 4180 などの CSV の標準的な慣行に沿ったものです。
無料版の制限
Spire.XLS for Python の無料版では、1シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は1シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを扱う場合は、pandas など別のライブラリを使用するか、有料版の利用を検討することになります。
他のライブラリとの比較
Python で Excel を CSV に変換する方法は複数あります。主なものを以下に示します。
| 方法 | 特徴 |
|---|---|
| pandas |
read_excel と to_csv で変換可能。大規模データにも対応。データ分析用途で広く使われる。 |
| openpyxl | .xlsx ファイルの読み書きが可能。CSV 出力は csv モジュールと組み合わせて実装する必要がある。 |
| xlrd | 古い .xls 形式の読み取りに対応(バージョン 2.0 以降は .xlsx 非対応)。CSV 出力は別途実装が必要。 |
| csv(標準ライブラリ) | Python 標準。ファイル入出力と組み合わせて使用する。 |
Spire.XLS for Python は、.xls 形式と .xlsx 形式の両方に対応しており、単一の API で複数のフォーマットを扱えることが特徴です。また、CSV 出力時にエスケープ処理が自動で行われるため、自力での実装が不要です。一方で、無料版の行数・列数制限があるため、扱うデータの規模に応じて適切なライブラリを選択する必要があります。
実用的なユースケース
以下は、複数の Excel ファイルをまとめて CSV に変換するバッチ処理の例です。特定のディレクトリ内のすべての .xlsx ファイルを対象とします。
import os
from spire.xls import Workbook
target_dir = "./excel_files"
output_dir = "./csv_output"
# 出力先ディレクトリがなければ作成
os.makedirs(output_dir, exist_ok=True)
# ディレクトリ内の全 .xlsx ファイルを処理
for filename in os.listdir(target_dir):
if filename.endswith(".xlsx"):
workbook = Workbook()
filepath = os.path.join(target_dir, filename)
workbook.LoadFromFile(filepath)
# 全シートを CSV に変換
for i in range(workbook.Worksheets.Count):
worksheet = workbook.Worksheets[i]
safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
output_filename = f"{os.path.splitext(filename)[0]}_{safe_name}.csv"
output_path = os.path.join(output_dir, output_filename)
worksheet.SaveToFile(output_path, ",")
workbook.Dispose()
このスクリプトを定期的に実行することで、手動作業を介さずに Excel データを CSV 形式で収集できます。
まとめ
Spire.XLS for Python を使用すると、数行のコードで Excel ファイルを CSV に変換できます。複数シートの処理や区切り文字の指定にも対応しており、データ連携やバッチ処理の自動化に利用可能です。
導入にあたっては、無料版の行数・列数の制限や、出力される CSV の文字コードに関する仕様を事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。