Excel ファイルと HTML は、それぞれ異なる用途で広く使われている形式です。Excel はデータの集計や分析に適しており、HTML は Web ページとしての表示や共有に適しています。業務においては、Excel で作成した表を Web ページに埋め込むために HTML に変換したり、Web 上のデータを Excel に取り込んで分析したりする場面があります。
この記事では、Spire.XLS for Python を使用して、Excel ファイルを HTML に変換する方法と、HTML を Excel に変換する方法の両方を、具体的なコード例とともに解説します。
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 を HTML に変換する
基本的な変換手順
Excel ファイルを HTML に変換する基本的な流れは次のとおりです。
-
Workbookオブジェクトを作成し、Excel ファイルを読み込む -
SaveToFileメソッドで HTML 形式を指定して保存する -
Disposeメソッドでリソースを解放する
以下のコードは、Excel ファイルを HTML として保存する例です。
from spire.xls import Workbook
from spire.xls import FileFormat
# Workbook オブジェクトの作成
workbook = Workbook()
# Excel ァイルの読み込み
workbook.LoadFromFile("data.xlsx")
# HTML 形式で保存
workbook.SaveToFile("output.html", FileFormat.HTML)
# リソースの解放
workbook.Dispose()
SaveToFile メソッドに FileFormat.HTML を指定することで、ワークブック全体が HTML ファイルとして出力されます。この方法では、Excel のセルの書式(フォント、色、罫線など)が一定の範囲で保持された状態で HTML に変換されます。
特定のワークシートのみを HTML に変換する
ワークブックに複数のシートが含まれている場合、特定のシートだけを HTML に変換するには、Worksheet オブジェクトの SaveToHtml メソッドを使用します。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 最初のワークシートのみを HTML に変換
worksheet = workbook.Worksheets[0]
worksheet.SaveToHtml("sheet1_output.html")
workbook.Dispose()
すべてのワークシートを個別の HTML ファイルに変換する
ワークブック内の全シートをそれぞれ個別の HTML ファイルとして保存するには、以下のようにループ処理を行います。
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("\\", "_")
worksheet.SaveToHtml(f"{safe_name}.html")
workbook.Dispose()
シート名にファイル名として使用できない文字が含まれている場合に備え、置換処理を追加しています。
変換時のオプション
Excel を HTML に変換する際、HTMLOptions クラスを使用して出力される HTML の内容を制御できます。
from spire.xls import Workbook
from spire.xls import HTMLOptions
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
worksheet = workbook.Worksheets[0]
# HTML 変換オプションの設定
options = HTMLOptions()
options.ImageEmbedded = True # 画像を Base64 で HTML 内に埋め込む
worksheet.SaveToHtml("output_with_images.html", options)
workbook.Dispose()
ImageEmbedded を True に設定すると、シート内の画像が Base64 エンコードされて HTML ファイル内に直接埋め込まれます。外部ファイルとして保存したい場合は False を指定します。
HTML を Excel に変換する
基本的な変換手順
HTML ファイルを Excel に変換する基本的な流れは次のとおりです。
-
Workbookオブジェクトを作成する -
LoadFromHtmlメソッドで HTML ファイルを読み込む -
SaveToFileメソッドで Excel 形式を指定して保存する -
Disposeメソッドでリソースを解放する
以下のコードは、HTML ファイルを Excel として保存する例です。
from spire.xls import Workbook
from spire.xls import FileFormat
# Workbook オブジェクトの作成
workbook = Workbook()
# HTML ファイルの読み込み
workbook.LoadFromHtml("data.html")
# Excel 形式で保存
workbook.SaveToFile("output.xlsx", FileFormat.Version2016)
# リソースの解放
workbook.Dispose()
LoadFromHtml メソッドは、HTML ファイル内のテーブル要素(<table>)を解析し、Excel のワークシートに変換します。複数のテーブルが含まれている場合、それぞれ別のワークシートとして読み込まれます。
HTML 文字列から直接読み込む
ファイルとして保存された HTML だけでなく、文字列として保持している HTML データを直接 Excel に変換することも可能です。
from spire.xls import Workbook
from spire.xls import FileFormat
# HTML 文字列
html_content = """
<table>
<tr><th>商品名</th><th>価格</th><th>在庫数</th></tr>
<tr><td>ノートPC</td><td>120000</td><td>15</td></tr>
<tr><td>マウス</td><td>3500</td><td>42</td></tr>
<tr><td>キーボード</td><td>7800</td><td>28</td></tr>
</table>
"""
workbook = Workbook()
# HTML 文字列から読み込み
workbook.LoadFromHtml(html_content)
workbook.SaveToFile("output_from_string.xlsx", FileFormat.Version2016)
workbook.Dispose()
複数の HTML ファイルを 1 つのワークブックにまとめる
複数の HTML ファイルを読み込み、それぞれを別のワークシートとして1つの Excel ファイルにまとめることもできます。
from spire.xls import Workbook
from spire.xls import FileFormat
import os
workbook = Workbook()
# 新規ワークブックには既定で空のシートが 1 つ含まれるため、後で削除する
first_sheet = True
html_dir = "./html_files"
html_files = sorted([f for f in os.listdir(html_dir) if f.endswith(".html")])
for html_file in html_files:
temp_workbook = Workbook()
temp_workbook.LoadFromHtml(os.path.join(html_dir, html_file))
for i in range(temp_workbook.Worksheets.Count):
source_sheet = temp_workbook.Worksheets[i]
sheet_name = os.path.splitext(html_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:
# 2つ目以降は新しいシートを追加
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_output.xlsx", FileFormat.Version2016)
workbook.Dispose()
前のバージョンでは CopyFrom メソッドを使用していましたが、このメソッドはシート間のデータコピーには適さないため、セル範囲の Copy メソッドを使用する方法に修正しています。
相互変換時の注意点
書式の保持
Excel を HTML に変換する際、フォント、色、罫線、セルの結合などの書式は一定の範囲で保持されますが、すべての書式が完全に再現されるわけではありません。特に、条件付き書式や一部の高度なグラフ機能は HTML 側で再現されない場合があります。
逆に、HTML を Excel に変換する際は、HTML の CSS スタイルが Excel の書式に変換されますが、対応していない CSS プロパティは無視されます。変換後は内容を確認し、必要に応じて手動で調整することを推奨します。
画像の扱い
Excel を HTML に変換する際、シート内の画像は外部ファイルとして保存されるか、Base64 エンコードで HTML 内に埋め込まれます。HTMLOptions クラスの ImageEmbedded プロパティでこの動作を制御できます。埋め込み方式を選択した場合、HTML ファイルのサイズが大きくなる可能性があります。
HTML を Excel に変換する際、HTML 内の画像(<img>タグ)は、アクセス可能な URL またはパスが指定されていれば Excel シート内に埋め込まれます。ローカルファイルを参照している場合は、変換時にファイルが存在することを確認してください。
文字コードの扱い
HTML ファイルを読み込む際、Spire.XLS for Python は HTML ファイルの文字コードを自動判別しようと試みます。ただし、文字コードが明示されていない HTML ファイルでは、環境によって文字化けが発生することがあります。HTML ファイル側で <meta charset="UTF-8"> のように文字コードを明示しておくことで、この問題を回避しやすくなります。
テーブル構造の解析
HTML を Excel に変換する際、<table> 要素が解析の対象となります。入れ子になったテーブルや、colspan/rowspan で複雑に結合されたセルについては、Excel のセル結合として変換されますが、複雑な構造の場合は期待どおりに変換されないことがあります。
無料版の制限
Spire.XLS for Python の無料版では、1 シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は 1 シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを扱う場合は、他のライブラリの利用を検討する必要があります。
メモリ管理
Workbook オブジェクトは処理後に Dispose メソッドでリソースを解放することが推奨されています。特に複数のファイルを連続して処理する場合は、メモリリークを防ぐために適切な解放処理が必要です。
他のライブラリとの比較
Python で Excel と HTML を相互変換する方法はいくつか存在します。
| 方法 | 特徴 |
|---|---|
| Spire.XLS for Python | Excel→HTML、HTML→Excel の双方向変換が可能。無料版は行数・列数に制限あり。 |
| pandas |
read_html で HTML テーブルを DataFrame に読み込み、to_excel で Excel 出力。to_html で Excel→HTML も可能。 |
| openpyxl | Excel→HTML の直接変換は非対応。HTML→Excel は pandas との組み合わせで実現。 |
| xlwings | Excel アプリケーションを介した変換。Windows/macOS のみ対応。Excel のインストールが必要。 |
Spire.XLS for Python は、双方向の変換を単一のAPIで行えること、また Excel アプリケーションのインストールが不要であることが特徴です。一方で、無料版の制限があるため、データの規模に応じて適切なライブラリを選択する必要があります。
実用的なユースケース
以下は、Excel ファイルを HTML に変換し、画像を埋め込んで Webレ ポートとして保存する例です。
from spire.xls import Workbook
from spire.xls import HTMLOptions
workbook = Workbook()
workbook.LoadFromFile("report.xlsx")
worksheet = workbook.Worksheets[0]
# HTML 変換オプションの設定
options = HTMLOptions()
options.ImageEmbedded = True # 画像を埋め込み
options.GridLinesShown = True # グリッド線を表示
worksheet.SaveToHtml("web_report.html", options)
workbook.Dispose()
また、以下は Web サイトから取得した HTML テーブルを Excel に変換する例です。
import requests
from spire.xls import Workbook
from spire.xls import FileFormat
# Web ページのHTMLを取得
response = requests.get("https://example.com/data-table.html")
html_content = response.text
workbook = Workbook()
workbook.LoadFromHtml(html_content)
workbook.SaveToFile("web_data.xlsx", FileFormat.Version2016)
workbook.Dispose()
まとめ
Spire.XLS for Python を使用すると、Excel ファイルをHTMLに変換し、また HTML を Excel ファイルに変換することができます。それぞれの変換において、書式の保持や画像の埋め込みなどのオプションが用意されており、用途に応じた出力の調整が可能です。
導入にあたっては、無料版の行数・列数の制限や、書式の再現性、文字コードの扱いについて事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。
用途やデータの規模に応じて適切なツールを選択し、効率的なデータ処理を実現してください。