日常のデータ分析や業務処理において、Excelファイルは依然として最も一般的なデータ保存・表示ツールです。売上レポート、財務明細、在庫リストなど、どのデータもExcelを使えば直感的に確認できます。しかし、いくつかの自動化シナリオでは、コードでExcelファイルを生成し、その内容を直接バイト列(byte stream)として保存して、転送、保存、またはさらなる処理に利用したい場合があります。この方法は特にWebバックエンド、クラウドストレージ、APIでExcelファイルを返すケースに適しています。
本記事では、Free Spire.XLS for Python を使用してExcelワークブックを作成し、データを書き込み、生成したExcelファイルをメモリ上のバイト列として保存する方法を、売上データの例を通してゼロから解説します。
pipでのインストール:
pip install spire.xls.free
1. ワークブックの初期化とワークシートの作成
まず、新しいExcelワークブックを作成し、データを格納するワークシートを追加します。表を整えるため、デフォルトで作成される空のワークシートは削除します。
from spire.xls import Workbook
# 新しいワークブックを作成
workbook = Workbook()
# デフォルトの空ワークシートを削除
workbook.Worksheets.Clear()
# 新しいワークシートを追加し、名前を「売上データ」に設定
sheet = workbook.Worksheets.Add("売上データ")
補足:
Workbook オブジェクトはExcelファイル全体を表し、Worksheets.Add() メソッドでワークシートを追加できます。名前を指定することで、複数のシートを区別できます。これにより、コード上でExcelファイルの構造を完全にコントロールできます。
2. ヘッダーとデータの書き込み
次に、ワークシートにヘッダーを作成し、サンプルの売上データを入力します。ヘッダーは「製品名」「売上額」「販売日」です。
# ヘッダーを書き込む
sheet.Range["A1"].Value = "製品名"
sheet.Range["B1"].Value = "売上額"
sheet.Range["C1"].Value = "販売日"
# サンプルデータ
data = [
("ノートパソコン", 1200.50, "2023-10-01"),
("スマートフォン", 800.75, "2023-10-05"),
("タブレット", 500.00, "2023-10-10"),
("モニター", 300.20, "2023-10-15"),
("キーボード", 75.99, "2023-10-20"),
]
# データを書き込む
for i, row_data in enumerate(data):
row_index = i + 2 # データは2行目から開始
sheet.Range[row_index, 1].Value = row_data[0] # 製品名
sheet.Range[row_index, 2].NumberValue = row_data[1] # 売上額(数値型)
sheet.Range[row_index, 3].Value = row_data[2] # 販売日
ポイント:
-
Range[row, col]でセルの位置を指定できます。行列インデックスは1から始まります。 -
NumberValue属性を使用すると、数値データがExcel内で計算可能になります。 -
enumerateを使用すると、行インデックスを自動計算しながらデータをループで書き込めます。
3. 簡単な書式設定
表を見やすくするため、ヘッダーを太字にし、列幅を内容に合わせて自動調整します。
# ヘッダーを太字に設定
sheet.Range["A1:C1"].Style.Font.IsBold = True
# 列幅を自動調整
sheet.AutoFitColumn(1)
sheet.AutoFitColumn(2)
sheet.AutoFitColumn(3)
補足:
AutoFitColumn() メソッドで列幅が内容に応じて自動調整され、文字が途切れることを防げます。ヘッダーを太字にすることで、データとの区別がつきやすくなります。
4. Excelファイルをバイト列として保存
場合によっては、直接ファイルを生成せずに、Excel内容をメモリ上のバイト列として保存し、後続処理やネットワーク転送に利用することがあります。
import io
from spire.xls import FileFormat, Stream
# BytesIOオブジェクトを作成
excel_stream = io.BytesIO()
# Streamオブジェクトを作成
excelStream = Stream()
# ワークブックをメモリストリームに保存(XLSX形式: FileFormat.Version2013)
workbook.SaveToStream(excelStream, FileFormat.Version2013)
# テスト用にファイルとして保存
excelStream.Save("output/output.xlsx")
# メモリストリームをBytesIOに書き込み
excel_stream.write(excelStream.ToArray())
# バイト列を取得
excel_bytes = excel_stream.getvalue()
# リソース解放
workbook.Dispose()
excel_stream.close()
print(f"生成されたExcelバイト列の長さ: {len(excel_bytes)} バイト")
補足:
-
BytesIOはメモリ上のストリームで、ファイルオブジェクトのように扱えます。 -
Streamクラスは、Spire.XLSが提供するメモリストリーム保存用クラスです。 -
SaveToStream()メソッドでワークブック内容をストリームに書き込みます。FileFormat.Version2013は標準XLSX形式で保存することを意味します。 -
excel_bytesが完全なExcelファイルの内容となり、HTTPレスポンスやデータベース保存、その他の処理に直接利用できます。
生成ファイルプレビュー:
まとめ
本記事では、PythonとSpire.XLSを使って、Excelファイルを作成・データ入力・基本書式設定を行い、ファイル内容をメモリ上のバイト列として保存する方法を解説しました。この方法はWebバックエンド、データAPI、レポート自動生成などのシナリオで非常に有用です。中間ファイルを作らずに済むため、処理効率も向上します。
Workbook、Worksheet、Range などの主要クラスと属性を理解することで、Excelの自動化処理を簡単に実装でき、作業効率を大幅に向上させられます。また、Excelファイルをバイト列として扱うことで、ダウンロード用ストリームの生成やクラウドへのアップロード、バイナリ処理など、より高度な業務ニーズにも対応可能です。
