チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

チュートリアル».NET»Spire.Presentation for .NET»保護»C#:PowerPoint プレゼンテーションを保護または保護解除する方法
2026-10-30

Python で Excel を CSV に変換する方法(複数シート・一括変換対応)

売上表や在庫表を基幹システムに取り込むとき、Excel ファイルを CSV に変換して受け渡す場面は少なくありません。CSV は軽量で扱いやすく、データベースや分析ツールの入力形式として広く使われています。

本記事では、Spire.XLS for Python を使って Excel ファイルを CSV に変換する方法を紹介します。1 つのシートだけを変換する基本形から、すべてのシートを個別の CSV に書き出す方法、フォルダ内の複数ファイルをまとめて変換する方法、必要な列だけを抽出する方法まで、実際に動作するコードで確認していきます。最後に、CSV から Excel へ戻す手順も扱います。

クイックナビゲーション


1. Excel から CSV への変換方法

Spire.XLS for Python には、用途に応じて 3 つの書き出し方法があります。

方法 出力される範囲 向いている用途
Workbook.SaveToFile(..., FileFormat.CSV) 先頭のワークシート 1 シートだけを手早く変換する
Worksheet.SaveToFile(path, delimiter, encoding) 指定したワークシート シートごとに個別の CSV を作る
csv モジュールとセル読み取り 指定した行・列 必要な列だけを抽出する

いずれも Microsoft Excel をインストールせずに実行できます。CSV の文字コードは、Encoding.get_UTF8() を指定すると UTF-8(BOM 付き)で保存され、Excel で開いたときにも日本語が正しく表示されます。


2. 実行環境とサンプルワークブック

ライブラリのインストール

pip install spire.xls

スクリプトでは、必要なクラスを読み込みます。

from spire.xls import Workbook, FileFormat, Encoding

サンプルワークブック

今回は、4 月・5 月・6 月の 3 シートを持つ 売上管理.xlsx を使います。各シートには、商品コード・商品名・数量・単価・金額の 5 列が入っています。

変換元の Excel ワークブック(売上管理.xlsx の 4 月シート)

シート名はそのまま CSV のファイル名に使えるため、月別・部門別のデータを配布する用途に向いています。


3. 最初のシートを CSV に保存する

もっとも簡単な方法は、ワークブックを読み込んで CSV として保存するだけです。

import os
from spire.xls import Workbook, FileFormat

os.makedirs("output", exist_ok=True)

workbook = Workbook()
workbook.LoadFromFile("売上管理.xlsx")
workbook.SaveToFile("output/売上管理_4月.csv", FileFormat.CSV)
workbook.Dispose()

SaveToFile() に FileFormat.CSV を指定すると、先頭のワークシートが CSV として保存されます。売上管理.xlsx では 4 月シートが先頭にあるため、4 月のデータだけが出力されます。

複数のシートを 1 ファイルずつ出力したい場合は、次の節の Worksheet.SaveToFile() を使います。


4. すべてのシートを個別の CSV に書き出す

シートごとに CSV を作る場合は、ワークシートを 1 枚ずつ取り出して SaveToFile() を呼び出します。出力先のフォルダは、あらかじめ作成しておきます。

import os
from spire.xls import Workbook, Encoding

os.makedirs("output/sheets", exist_ok=True)

workbook = Workbook()
workbook.LoadFromFile("売上管理.xlsx")

for i in range(workbook.Worksheets.Count):
    sheet = workbook.Worksheets.get_Item(i)
    path = os.path.join("output", "sheets", f"{sheet.Name}.csv")
    sheet.SaveToFile(path, ",", Encoding.get_UTF8())
    print(f"{sheet.Name} → {path}")

workbook.Dispose()

Worksheet.SaveToFile() の引数には、出力パス、区切り文字、文字コードを指定します。区切り文字に "," を渡すとカンマ区切りの CSV になり、Encoding.get_UTF8() で UTF-8(BOM 付き)として保存されます。

このコードを実行すると、シート名に対応した 3 つの CSV が作成されます。

すべてのシートを個別の CSV に書き出したときのコンソール出力

出力された 4 月の CSV は次のとおりです。

シートごとに書き出された 4月.csv の内容

シート名をそのままファイル名に使う場合は、シート名に含まれる記号に注意します。OS によってファイル名の扱いが異なるため、記号を含むシート名では sheet.Name を置換してからパスを組み立てると安全です。


5. 旧形式の .xls を CSV に変換する

.xls ファイルも、.xlsx と同じ手順で変換できます。

from spire.xls import Workbook, FileFormat

workbook = Workbook()
workbook.LoadFromFile("旧形式_売上.xls")
workbook.SaveToFile("output/旧形式_売上.csv", FileFormat.CSV)
workbook.Dispose()

LoadFromFile() は拡張子から形式を判断するため、読み込み側のコードを変える必要はありません。すべてのシートを変換したい場合は、前節のループをそのまま .xls ファイルに対して実行します。


6. フォルダ内の Excel を一括変換する

複数の Excel ファイルをまとめて変換する場合は、フォルダ内のファイルを列挙し、拡張子を確認してから 1 件ずつ処理します。

import os
from spire.xls import Workbook, FileFormat

excel_dir = "input"
output_dir = "output/batch"
os.makedirs(output_dir, exist_ok=True)

for file in sorted(os.listdir(excel_dir)):
    if not file.lower().endswith((".xlsx", ".xls")):
        continue
    if file.startswith("~$"):
        continue

    workbook = Workbook()
    workbook.LoadFromFile(os.path.join(excel_dir, file))
    base_name = os.path.splitext(file)[0]
    out_path = os.path.join(output_dir, base_name + ".csv")
    workbook.SaveToFile(out_path, FileFormat.CSV)
    workbook.Dispose()
    print(f"{file} → output/batch/{base_name}.csv")

os.path.splitext(file)[0] で拡張子を除いたファイル名を取り出し、同じ名前の CSV として保存します。拡張子の判定を file.lower() にそろえると、.XLSX のような大文字の拡張子も同じ処理で扱えます。

~$ で始まるファイルは Excel が作業中用に作る一時ファイルです。変換対象から除外しておくと、フォルダ内に一時ファイルが残っている場合も安定して処理できます。

実行すると、フォルダ内の 3 ファイルがそれぞれ CSV に変換されます。

フォルダ内の Excel を一括で CSV に変換したときのコンソール出力


7. 必要な列だけを CSV に書き出す

「商品コード・商品名・単価だけを抽出したい」という場合は、セルを読み取りながら csv モジュールで書き出します。列の指定は 1 始まりです。

import csv
from spire.xls import Workbook

workbook = Workbook()
workbook.LoadFromFile("売上管理.xlsx")
sheet = workbook.Worksheets.get_Item(0)

with open("output/商品別単価.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    for row in range(1, sheet.LastRow + 1):
        writer.writerow([sheet.Range[row, col].Value for col in (1, 2, 4)])

workbook.Dispose()

sheet.LastRow はデータが入っている最終行を返すため、行数を決め打ちせずにすべての行を処理できます。sheet.Range[row, col].Value でセルの値を取得し、csv.writer で 1 行ずつ書き出します。

この例では、1 列目(商品コード)、2 列目(商品名)、4 列目(単価)だけを出力しています。

必要な列だけを抽出した商品別単価.csv の内容

列の並びを変えたい場合は、(1, 2, 4) の順番を入れ替えるだけです。ヘッダーを除外したい場合は、ループの開始行を 2 にします。


8. CSV から Excel に戻す

CSV を Excel ファイルとして保存し直すこともできます。LoadFromFile() の第 2 引数に区切り文字を指定します。

from spire.xls import Workbook, FileFormat

workbook = Workbook()
workbook.LoadFromFile("output/sheets/4月.csv", ",")
print("シート数:", workbook.Worksheets.Count)
print("行数:", workbook.Worksheets[0].LastRow)
workbook.SaveToFile("output/CSVから復元.xlsx", FileFormat.Version2016)
workbook.Dispose()

CSV を読み込むと、1 枚のワークシートを持つワークブックとして扱われます。CSV の値は文字列として読み込まれるため、数値として計算したい場合は Excel 側で数値形式に変換します。FileFormat.Version2016 を指定して保存すると、.xlsx ファイルとして出力されます。加工した CSV を Excel 形式で配布したい場合や、表計算ソフトで開いて書式を整えたい場合に便利です。

CSV から復元した Excel ファイル(CSVから復元.xlsx)


まとめ

本記事では、Spire.XLS for Python を使って Excel を CSV に変換する方法を紹介しました。

  1. 1 シートだけなら Workbook.SaveToFile() — FileFormat.CSV を指定すると、先頭のシートが CSV になります。
  2. 複数シートなら Worksheet.SaveToFile() — シートごとに区切り文字と文字コードを指定して、個別の CSV を作成します。
  3. 一括変換はフォルダを列挙 — 拡張子を確認し、os.path.splitext() でファイル名を引き継ぎます。
  4. 列を絞るならセル読み取り+csv モジュール — LastRow と Value を使って必要な列だけを書き出します。

変換の流れをスクリプト化しておくと、月次処理や部門別のデータ配布を同じ手順で繰り返せます。CSV から Excel への復元も同じライブラリで行えるため、データの受け渡しと再利用を一つのコードベースで管理できます。

Excel を PDF に変換する方法は Python で Excel を PDF に変換する方法 で、CSV の読み書きは Python リストを CSV に変換する方法 と Python で CSV をリストへ変換する方法 で解説しています。

Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。


10. FAQ

Microsoft Excel をインストールせずに Excel を CSV に変換できますか?

はい。Spire.XLS for Python は Excel のアプリケーションに依存せず、Python スクリプトだけで .xlsx と .xls の読み込みと CSV への書き出しを実行できます。

すべてのシートを 1 つの CSV にまとめられますか?

CSV は 1 つの表を表す形式のため、シートごとに個別のファイルとして出力するのが基本です。1 つにまとめたい場合は、各シートの値を読み取って 1 つの CSV に追記していきます。本記事の必要な列だけを CSV に書き出すコードを、シートのループと組み合わせると実現できます。

日本語が文字化けしないようにするにはどうすればよいですか?

Worksheet.SaveToFile() の第 3 引数に Encoding.get_UTF8() を指定します。UTF-8(BOM 付き)で保存されるため、Excel で開いたときにも日本語が正しく表示されます。

.xls ファイルも同じコードで変換できますか?

はい。LoadFromFile() が拡張子から形式を判断するため、.xlsx を読み込むコードのファイル名を変えるだけで .xls にも対応できます。すべてのシートを変換する場合も、同じループ処理が使えます。

特定の列だけを CSV に出力するにはどうすればよいですか?

sheet.Range[row, col].Value でセルの値を取得し、csv.writer で書き出します。列番号は 1 始まりです。本記事のサンプルでは (1, 2, 4) を指定して、商品コード・商品名・単価の 3 列を抽出しています。

CSV から Excel に戻すことはできますか?

はい。Workbook.LoadFromFile("data.csv", ",") で CSV を読み込み、SaveToFile("data.xlsx", FileFormat.Version2016) で Excel ファイルとして保存できます。

Read 9 times