Excel ファイルの基盤となっている Office Open XML(OOXML) 形式は、Microsoft Office で標準的に使用されているファイルフォーマットです。.xlsx ファイルの内部構造は ZIP 圧縮された XML ファイルの集合体であり、この XML を直接操作することで、Excel アプリケーションなしにファイルの内容を制御できます。
一方で、業務で扱う Excel ファイルの内容をプログラムから読み書きしたい場合、XML を直接パースするのは手間がかかるため、抽象化された API を通じて操作できると便利です。この記事では、Spire.XLS for Python を使用して、Excel ファイルと Open XML ファイルを相互に変換する手順を、具体的なコード例とともに解説します。
Spire.XLS for Python の概要
Spire.XLS for Python は、Python 環境から Excel ファイルの読み込み、作成、編集、変換を行うためのライブラリです。.NET 向けに開発された Spire.XLS を Python から利用できるようにしたもので、以下のような操作が可能です。
- Excel ワークブックの読み込みと新規作成
- セルデータの読み取りと書き込み
- 数式や書式の設定
- グラフや画像の操作
- PDF、CSV、HTML、画像、Open XML などの各種形式への変換
- Windows、Linux、macOS での動作
このライブラリには無料版と有料版があります。無料版ではシートあたりの変換可能な行数や列数に上限が設けられています。大規模なファイルを扱う場合は、事前に公式の制限事項を確認する必要があります。
環境の準備
Spire.XLS for Python は PyPI に登録されており、以下のコマンドでインストールできます。
pip install Spire.XLS
インストールが完了したら、Python スクリプト内で必要なクラスをインポートして使用します。
from spire.xls import Workbook
from spire.xls import FileFormat
Excel ファイルと Open XML の関係
Office Open XML 形式について簡単に触れておきます。.xlsx ファイルの拡張子を .zip に変更して解凍すると、以下のような XML ファイル群が現れます。
-
[Content_Types].xml:ファイルの種類を定義 -
xl/workbook.xml:ワークブックの構成 -
xl/worksheets/sheet1.xml:各シートのデータ -
xl/styles.xml:セルの書式定義 -
xl/sharedStrings.xml:文字列テーブル
Spire.XLS for Python では、これらの XML 構造を意識することなく、Excel ファイルの内容を Open XML ファイルとして保存したり、Open XML ファイルを Excel ファイルとして読み込んだりすることができます。
Excel を Open XML に変換する
ワークブック全体を XML ファイルとして保存する
Excel ファイルを Open XML 形式で保存する基本的な手順は次のとおりです。
from spire.xls import Workbook
from spire.xls import FileFormat
# Workbook オブジェクトの作成
workbook = Workbook()
# Excel ファイルの読み込み
workbook.LoadFromFile("data.xlsx")
# Open XML 形式で保存(Spreadsheet ML)
workbook.SaveToFile("output.xml", FileFormat.XML)
# リソースの解放
workbook.Dispose()
FileFormat.XML を指定することで、Excel の内容が Spreadsheet ML 形式の XML ファイルとして出力されます。この XML ファイルには、セルのデータ、書式、数式などの情報が含まれます。
特定のワークシートのみを Open XML として保存する
ワークブック内の特定のシートだけを Open XML として保存したい場合は、Worksheet オブジェクトの SaveToFile メソッドを使用します。
from spire.xls import Workbook
from spire.xls import FileFormat
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 2 番目のワークシートを取得
worksheet = workbook.Worksheets[1]
worksheet.SaveToFile("sheet2_output.xml", FileFormat.XML)
workbook.Dispose()
この方法では、指定したワークシートのデータのみが XML ファイルとして保存されます。
すべてのワークシートを個別の Open XML ファイルに変換する
ワークブック内の全シートをそれぞれ個別の XML ファイルとして保存するには、以下のようにループ処理を行います。
from spire.xls import Workbook
from spire.xls import FileFormat
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 全ワークシートをループ
for i in range(workbook.Worksheets.Count):
worksheet = workbook.Worksheets[i]
safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
worksheet.SaveToFile(f"{safe_name}.xml", FileFormat.XML)
workbook.Dispose()
シート名にファイル名として使用できない文字(/や\など)が含まれている場合に備え、置換処理を追加しています。
ワークブックのデータ構造を含めて保存する
FileFormat.XML で保存される XML は、主にワークシートのデータを表現したものです。ワークブック全体の構造(シート一覧、定義された名前など)を含めて保存したい場合は、SaveAsXml メソッドを使用する方法もあります。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# ワークブック全体の構造を XML として保存
workbook.SaveAsXml("workbook_structure.xml")
workbook.Dispose()
SaveAsXml メソッドは、ワークブック全体のメタデータを含む XML を出力します。
Open XML を Excel に変換する
Open XML ファイルを Excel として読み込む
Open XML ファイルを Excel ワークブックとして読み込む手順は、通常の Excel ファイルの読み込みと同様です。LoadFromFile メソッドは、.xlsx、.xls、.xml などの形式を自動的に判別して読み込みます。
from spire.xls import Workbook
from spire.xls import FileFormat
# Workbook オブジェクトの作成
workbook = Workbook()
# Open XML ファイルの読み込み
workbook.LoadFromFile("data.xml")
# Excel 形式で保存
workbook.SaveToFile("output.xlsx", FileFormat.Version2016)
# リソースの解放
workbook.Dispose()
Open XML 文字列から直接読み込む
ファイルとして保存された XML だけでなく、文字列として保持している Open XML データを直接 Excel ワークブックに変換することも可能です。LoadFromXml メソッドを使用します。
from spire.xls import Workbook
from spire.xls import FileFormat
# Open XML 文字列(Spreadsheet ML 形式)
xml_content = """<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<Cell><Data ss:Type="String">商品名</Data></Cell>
<Cell><Data ss:Type="String">価格</Data></Cell>
<Cell><Data ss:Type="String">在庫数</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">ノートPC</Data></Cell>
<Cell><Data ss:Type="Number">120000</Data></Cell>
<Cell><Data ss:Type="Number">15</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">マウス</Data></Cell>
<Cell><Data ss:Type="Number">3500</Data></Cell>
<Cell><Data ss:Type="Number">42</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
"""
workbook = Workbook()
# Open XML 文字列から読み込み
workbook.LoadFromXml(xml_content)
workbook.SaveToFile("output_from_xml.xlsx", FileFormat.Version2016)
workbook.Dispose()
この方法は、外部システムから取得したXMLデータや、プログラムで動的に生成した XML を Excel ファイルに変換する場合に使用できます。
複数の Open XML ファイルを 1 つのワークブックにまとめる
複数の Open XML ファイルを読み込み、それぞれを別のワークシートとして 1 つの Excel ファイルにまとめる例です。
from spire.xls import Workbook
from spire.xls import FileFormat
import os
workbook = Workbook()
first_sheet = True
xml_dir = "./xml_files"
xml_files = sorted([f for f in os.listdir(xml_dir) if f.endswith(".xml")])
for xml_file in xml_files:
temp_workbook = Workbook()
temp_workbook.LoadFromFile(os.path.join(xml_dir, xml_file))
for i in range(temp_workbook.Worksheets.Count):
source_sheet = temp_workbook.Worksheets[i]
sheet_name = os.path.splitext(xml_file)[0][:31]
if first_sheet:
target_sheet = workbook.Worksheets[0]
target_sheet.Name = sheet_name
source_range = source_sheet.Range[1, 1, source_sheet.LastRow, source_sheet.LastColumn]
target_range = target_sheet.Range[1, 1, source_sheet.LastRow, source_sheet.LastColumn]
source_range.Copy(target_range)
first_sheet = False
else:
dest_sheet = workbook.Worksheets.Add(sheet_name)
source_range = source_sheet.Range[1, 1, source_sheet.LastRow, source_sheet.LastColumn]
target_range = dest_sheet.Range[1, 1, source_sheet.LastRow, source_sheet.LastColumn]
source_range.Copy(target_range)
temp_workbook.Dispose()
workbook.SaveToFile("combined_from_xml.xlsx", FileFormat.Version2016)
workbook.Dispose()
変換時の注意点
Spreadsheet ML と Office Open XML の違い
ここで扱っている Open XML は、正確には「Spreadsheet ML」(Spreadsheet Markup Language)と呼ばれる形式です。これは Office 2003 以前で使用されていたXML形式であり、Office 2007 以降の .xlsx ファイルの内部 XML(Office Open XML Strict)とはスキーマが異なります。
Spire.XLS for Python の FileFormat.XML は Spreadsheet ML 形式での出力を行います。この XML は Excel で直接開くことができ、またプログラムからの解析も比較的容易です。
数式の扱い
Excel ファイルを Open XML に変換する際、セルに含まれる数式はXML内に保持されます。数式は ss:Formula 属性として保存され、計算結果は <Data> 要素に含まれます。Open XML から Excel に変換する際も、これらの数式情報は復元されます。
書式の保持
フォント、色、罫線、セルの結合などの書式は、Spreadsheet ML 内のスタイル定義として保存されます。ただし、条件付き書式や一部の高度な書式設定は、XML への変換時に完全には保持されない場合があります。相互変換後は内容を確認することを推奨します。
画像やグラフの扱い
ワークシートに埋め込まれた画像やグラフは、FileFormat.XML での保存時には XML ファイル内に Base64 エンコード形式で埋め込まれます。ファイルサイズが大きくなる可能性があるため、画像を多く含むファイルを変換する際は留意してください。
無料版の制限
Spire.XLS for Python の無料版では、1 シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は 1 シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを扱う場合は、他のライブラリの利用を検討する必要があります。
メモリ管理
Workbook オブジェクトは処理後に Dispose メソッドでリソースを解放することが推奨されています。特に複数のファイルを連続して処理する場合は、メモリリークを防ぐために適切な解放処理が必要です。
他のライブラリとの比較
Python で Excel と Open XML を相互に扱う方法はいくつか存在します。
| 方法 | 特徴 |
|---|---|
| Spire.XLS for Python | 抽象化された API で Excel↔Open XML 変換が可能。無料版は行数・列数に制限あり。 |
| openpyxl | .xlsx ファイルの読み書きが可能。XML の直接操作は非対応。 |
| lxml + zipfile | .xlsx を ZIP として解凍し、内部 XML を直接解析・編集。柔軟性が高いが、仕様の理解が必要。 |
| xml.etree.ElementTree | Python 標準ライブラリ。Spreadsheet ML の解析に使用可能。 |
Spire.XLS for Python は、Excel ファイルの内部構造を意識することなく、統一的な API で相互変換できることが特徴です。一方で、無料版の制限があるため、大規模なデータや XML スキーマの詳細な制御が必要な場合は、他の方法を選択する必要があります。
実用的なユースケース
Excel データをXMLベースのシステムと連携する
以下は、Excel ファイルの内容を Open XML に変換し、外部システムに渡すための XML ファイルを生成する例です。
from spire.xls import Workbook
from spire.xls import FileFormat
workbook = Workbook()
workbook.LoadFromFile("monthly_report.xlsx")
# 特定のシートを Open XML として出力
worksheet = workbook.Worksheets[0]
worksheet.SaveToFile("report_data.xml", FileFormat.XML)
workbook.Dispose()
XML データを Excelレ ポートに変換する
以下は、プログラムで生成した Open XML データを Excel ファイルに変換する例です。
from spire.xls import Workbook
from spire.xls import FileFormat
from datetime import datetime
# 動的に XML を生成
def generate_sales_xml(data):
xml = '<?xml version="1.0"?>\n'
xml += '<?mso-application progid="Excel.Sheet"?>\n'
xml += '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"\n'
xml += ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">\n'
xml += ' <Worksheet ss:Name="Sales">\n <Table>\n'
# ヘッダー行
xml += ' <Row>\n'
for header in data["headers"]:
xml += f' <Cell><Data ss:Type="String">{header}</Data></Cell>\n'
xml += ' </Row>\n'
# データ行
for row in data["rows"]:
xml += ' <Row>\n'
for cell in row:
if isinstance(cell, (int, float)):
xml += f' <Cell><Data ss:Type="Number">{cell}</Data></Cell>\n'
else:
xml += f' <Cell><Data ss:Type="String">{cell}</Data></Cell>\n'
xml += ' </Row>\n'
xml += ' </Table>\n </Worksheet>\n</Workbook>'
return xml
# サンプルデータ
data = {
"headers": ["日付", "商品名", "数量", "金額"],
"rows": [
["2025-01-15", "ノートPC", 5, 600000],
["2025-01-16", "マウス", 20, 70000],
["2025-01-17", "キーボード", 12, 93600],
]
}
xml_content = generate_sales_xml(data)
workbook = Workbook()
workbook.LoadFromXml(xml_content)
workbook.SaveToFile(f"sales_report_{datetime.now().strftime('%Y%m%d')}.xlsx", FileFormat.Version2016)
workbook.Dispose()
まとめ
Spire.XLS for Python を使用すると、Excel ファイルを Open XML(Spreadsheet ML)形式に変換し、また Open XML データを Excel ファイルに変換することができます。これにより、XML ベースのシステムとのデータ連携や、プログラムによる Excel ファイルの動的生成が可能になります。
導入にあたっては、無料版の行数・列数の制限や、Spreadsheet ML と Office Open XML Strict の違い、書式の再現性について事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。
用途やデータの規模に応じて適切なツールを選択し、効率的なデータ処理を実現してください。