0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでExcelをHTMLに変換する

0
Posted at

企業データ管理と情報共有のシーンにおいて、Excelファイルは機能が強力である一方、クロスプラットフォームでの閲覧、オンライン表示、迅速な共有においては限界があります。多くのユーザーは、Excel表をウェブページに公開してチームメンバーがオンラインで確認できるようにしたり、社内システムに埋め込んでデータを表示したりする必要があります。しかし、手動でExcelをHTMLに変換するのは煩雑な作業であり、元の書式、スタイル、画像を維持することも困難です。特に大量のレポートを処理したり、自動的にウェブレポートを生成したりする場合、プログラミングによる方法が最も効率的な解決策となります。

本記事では、Pythonを使用してExcelワークシートまたはワークブック全体をHTML形式に変換し、元のデータの構造、スタイル、グラフを保持する方法を紹介します。このプロセスは完全に自動化でき、財務レポートのオンライン公開、業務データダッシュボード、プロジェクト進捗追跡ページなどのシナリオに適しています。

本記事で紹介する方法には Free Spire.XLS for Python が必要です。pipでインストールできます:

pip install spire.xls.free

1. 環境準備と基本変換

まず、サンプルデータを含むExcelファイルを作成し、それをHTMLに変換します。営業チームの四半期業績レポートをシミュレートします:

from spire.xls import Workbook, ExcelVersion

outputFile = "SalesReport.xlsx"

# 新しいワークブックを作成
workbook = Workbook()
sheet = workbook.Worksheets[0]
sheet.Name = "第1四半期営業成績"

# ヘッダーを書き込み
headers = ["営業担当者", "第1四半期", "第2四半期", "第3四半期", "第4四半期", "年間合計"]
for col, header in enumerate(headers, start=1):
    sheet.Range[1, col].Text = header
    sheet.Range[1, col].Style.Font.IsBold = True

# サンプルデータを書き込み
sales_data = [
    ["田中太郎", 12500000, 13800000, 14200000, 15600000, 56100000],
    ["佐藤花子", 9800000, 11200000, 12500000, 13400000, 46900000],
    ["鈴木一郎", 14500000, 15200000, 16800000, 17500000, 64000000],
    ["高橋美咲", 8700000, 9500000, 10200000, 11800000, 40200000],
]

for row, data in enumerate(sales_data, start=2):
    for col, value in enumerate(data, start=1):
        if isinstance(value, str):
            sheet.Range[row, col].Value = value
        else:
            sheet.Range[row, col].NumberValue = value
            sheet.Range[row, col].Style.NumberFormat = "#,##0"

# 列幅を自動調整
sheet.Range.AutoFitColumns()

# Excelファイルを保存
workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
workbook.Dispose()
print("Excelファイルを作成しました:SalesReport.xlsx")

説明:

  • Workbook() は新しいExcelワークブックオブジェクトを作成
  • Worksheets[0] は最初のワークシートを取得(デフォルトでワークブックには3つのワークシートが含まれる)
  • Range[row, col] は行と列のインデックスでセルにアクセス
  • NumberFormat は数値書式を設定し、金額を読みやすく表示
  • AutoFitColumns() はコンテンツに合わせて列幅を自動調整

このステップでは、営業データを含むExcelファイルを作成し、後続のHTML変換のソースファイルとして提供します。


2. 単一ワークシートをHTMLに変換

次に、先ほど作成したExcelファイルを読み込み、最初のワークシートをHTML形式に変換します:

from spire.xls import Workbook, HTMLOptions

inputFile = "SalesReport.xlsx"
outputFile = "SalesReport_Sheet.html"

# Excelファイルを読み込み
workbook = Workbook()
workbook.LoadFromFile(inputFile)

# 最初のワークシートを取得
sheet = workbook.Worksheets[0]

# HTMLオプションを作成し、画像埋め込みを設定
options = HTMLOptions()
options.ImageEmbedded = True

# ワークシートをHTMLに変換
sheet.SaveToHtml(outputFile)
workbook.Dispose()
print("ワークシートをHTMLに変換しました:SalesReport_Sheet.html")

説明:

  • LoadFromFile() はディスクから既存のExcelファイルを読み込む
  • HTMLOptions() はHTML変換オプションオブジェクトを作成
  • ImageEmbedded = True は画像をBase64エンコーディングでHTMLに埋め込み、外部依存を回避
  • SaveToHtml() はワークシートの内容をHTMLファイルとしてエクスポート

ワークシートプレビュー:

PythonでExcelワークシートをHTMLに変換

注意事項:

  • ワークシートに画像、グラフなどのグラフィック要素が含まれる場合、ImageEmbedded オプションの有効化を推奨
  • 変換後のHTMLファイルはブラウザで直接開いて確認可能
  • この方法は指定された現在のワークシートのみを変換し、他のワークシートの内容は含まない

3. ワークブック全体をHTMLに変換

Excelファイルに複数のワークシートが含まれる場合、ワークブックレベルの変換メソッドを使用して、すべてのワークシートを一度にHTMLに変換できます:

from spire.xls import Workbook

inputFile = "MultiSheetReport.xlsx"
outputFile = "MultiSheetReport.html"

# 複数のワークシートを含むExcelファイルを作成
workbook = Workbook()

# 最初のワークシート - 営業データ
sheet1 = workbook.Worksheets[0]
sheet1.Name = "営業データ"
sheet1.Range["A1"].Text = "製品名"
sheet1.Range["B1"].Text = "販売数量"
sheet1.Range["C1"].Text = "売上高"
sheet1.Range["A2"].Text = "ノートパソコン"
sheet1.Range["B2"].NumberValue = 1250
sheet1.Range["C2"].NumberValue = 625000000
sheet1.Range["A3"].Text = "タブレット"
sheet1.Range["B3"].NumberValue = 890
sheet1.Range["C3"].NumberValue = 267000000

# 2番目のワークシート - 在庫データ
sheet2 = workbook.Worksheets.Add("在庫データ")
sheet2.Range["A1"].Text = "製品名"
sheet2.Range["B1"].Text = "在庫数量"
sheet2.Range["C1"].Text = "倉庫位置"
sheet2.Range["A2"].Text = "ノートパソコン"
sheet2.Range["B2"].NumberValue = 350
sheet2.Range["C2"].Text = "Aエリア-01"
sheet2.Range["A3"].Text = "タブレット"
sheet2.Range["B3"].NumberValue = 280
sheet2.Range["C3"].Text = "Bエリア-03"

# 複数ワークシートのExcelファイルを保存
workbook.SaveToFile(inputFile, ExcelVersion.Version2013)
workbook.Dispose()

# 再読み込みしてHTMLに変換
workbook = Workbook()
workbook.LoadFromFile(inputFile)

# ワークブック全体をHTMLに変換(すべてのワークシートを含む)
workbook.SaveToHtml(outputFile)
workbook.Dispose()
print("ワークブック全体をHTMLに変換しました:MultiSheetReport.html")

説明:

  • Worksheets.Add() はワークブックに新しいワークシートを追加
  • workbook.SaveToHtml() はワークブックのすべてのワークシートをHTMLに変換
  • 変換後のHTMLファイルにはナビゲーションリンクが含まれ、異なるワークシート間の切り替えが容易

ワークブックプレビュー:

PythonでExcelワークブックをHTMLに変換

应用场景:

  • 月次総合レポート:営業、在庫、財務など複数の次元を含む
  • プロジェクト管理ドキュメント:タスクリスト、進捗追跡、リソース配分などのワークシートを含む
  • 学生成績管理システム:各クラスの成績、統計分析などのワークシートを含む

4. ストリーム出力を使用してHTMLに変換

HTMLコンテンツをさらに処理する必要があるシナリオでは、ストリーム出力方式を使用できます。変換結果をメモリストレームやカスタムストリームに保存できます:

from spire.xls import Workbook, HTMLOptions, Stream

inputFile = "SalesReport.xlsx"
outputFile = "SalesReport_Stream.html"

# Excelファイルを読み込み
workbook = Workbook()
workbook.LoadFromFile(inputFile)

# 最初のワークシートを取得
sheet = workbook.Worksheets[0]

# HTMLオプションを設定
options = HTMLOptions()
options.ImageEmbedded = True

# 出力ストリームを作成して変換
fileStream = Stream(outputFile)
sheet.SaveToHtml(fileStream, options)
fileStream.Close()
workbook.Dispose()
print("ストリーム出力でHTMLに変換しました:SalesReport_Stream.html")

説明:

  • Stream() はファイルストリームオブジェクトを作成し、出力プロセスを制御
  • SaveToHtml(fileStream, options) はワークシートの内容を指定されたストリームに書き込む
  • fileStream.Close() はストリームを閉じてリソースを解放

优势:

  • 書き込み前にHTMLコンテンツに対して追加処理が可能
  • カスタム出力パスとファイル名をサポート
  • 大規模なデータ処理フローへの統合が容易

5. 主要クラスとメソッドの解析

コアクラスの説明

Workbook クラス

Workbook はExcel操作全体のエントリーポイントであり、完全なExcelファイルを表します。

常用メソッド:

メソッド 説明
LoadFromFile(filePath) 指定されたパスからExcelファイルを読み込む
SaveToFile(filePath, version) ワークブックをExcelファイルとして保存
SaveToHtml(filePath) ワークブック全体をHTMLファイルに変換
Dispose() ワークブックが使用するリソースを解放

プロパティ:

プロパティ 説明
Worksheets ワークブック内のすべてのワークシートコレクションを取得

Worksheet クラス

Worksheet はExcel内の単一ワークシートを表し、データ操作の主要オブジェクトです。

常用メソッド:

メソッド 説明
SaveToHtml(filePath) 現在のワークシートをHTMLファイルに変換
SaveToHtml(stream, options) ワークシートをHTMLに変換してストリームに書き込む
AutoFitColumns() すべての列の幅を自動調整

プロパティ:

プロパティ 説明
Name ワークシート名を取得または設定
Range ワークシートのセル範囲オブジェクトを取得

HTMLOptions クラス

HTMLOptions はHTML変換の各種オプションを設定するために使用されます。

常用プロパティ:

プロパティ 説明 デフォルト値
ImageEmbedded 画像をHTMLに埋め込むかどうか(Base64エンコーディング) False

使用建议:

  • ワークシートに画像やグラフが含まれる場合、必ず ImageEmbedded = True を設定
  • 画像の埋め込みはHTMLファイルサイズを増加させるが、外部ファイル依存を回避
  • HTMLファイルを個別に配布するシナリオに適している

Stream クラス

Stream はストリームI/O操作を提供し、ファイル出力の柔軟な制御を可能にします。

常用メソッド:

メソッド 説明
Close() ストリームを閉じてリソースを解放

使用场景:

  • 書き込み前にデータを処理する必要がある場合
  • 出力をカスタムターゲットにリダイレクトする場合
  • 非同期またはバッチ処理フローに統合する場合

6. 実应用例:自動化レポート公開

以下は完全な実際の応用シナリオで、営業レポートを自動生成してHTMLとして公開する方法を示します:

from spire.xls import Workbook, ExcelVersion, HTMLOptions
from datetime import datetime

def generate_sales_report():
    """営業レポートを生成してHTMLに変換"""
    
    # 工作报告を作成
    workbook = Workbook()
    sheet = workbook.Worksheets[0]
    sheet.Name = f"{datetime.now().strftime('%Y年%m月')}営業レポート"
    
    # レポートタイトルを書き込み
    sheet.Range["A1"].Text = "月次営業業績レポート"
    sheet.Range["A1"].Style.Font.Size = 16
    sheet.Range["A1"].Style.Font.IsBold = True
    sheet.Range["A1"].Style.HorizontalAlignment = 1  # 中央揃え
    
    # セルを結合してタイトルとして使用
    sheet.Range["A1:F1"].Merge()
    
    # ヘッダーを書き込み
    headers = ["営業担当者", "製品カテゴリ", "販売数量", "単価(円)", "売上高(円)", "達成率"]
    for col, header in enumerate(headers, start=1):
        cell = sheet.Range[3, col]
        cell.Text = header
        cell.Style.Font.IsBold = True
        cell.Style.Color = Color.get_LightBlue()
    
    # 模擬営業データ
    sales_data = [
        ["田中太郎", "ノートパソコン", 45, 550000, 24750000, 0.92],
        ["田中太郎", "タブレット", 32, 320000, 10240000, 0.88],
        ["佐藤花子", "ノートパソコン", 38, 550000, 20900000, 0.85],
        ["佐藤花子", "タブレット", 28, 320000, 8960000, 0.80],
        ["鈴木一郎", "ノートパソコン", 52, 550000, 28600000, 0.95],
        ["鈴木一郎", "タブレット", 41, 320000, 13120000, 0.91],
    ]
    
    # データ行を書き込み
    for row_idx, data in enumerate(sales_data, start=4):
        for col_idx, value in enumerate(data, start=1):
            cell = sheet.Range[row_idx, col_idx]
            if isinstance(value, str):
                cell.Value = value
            elif isinstance(value, float):
                cell.NumberValue = value
                cell.Style.NumberFormat = "0%"
            else:
                cell.NumberValue = value
                if col_idx >= 4:  # 金額列
                    cell.Style.NumberFormat = "#,##0"
    
    # 合計行を計算
    total_row = len(sales_data) + 4
    sheet.Range[total_row, 1].Text = "合計"
    sheet.Range[total_row, 1].Style.Font.IsBold = True
    
    # 列幅を自動調整
    sheet.Range.AutoFitColumns()
    
    # Excelファイルを保存
    excel_file = f"Sales_Report_{datetime.now().strftime('%Y%m%d')}.xlsx"
    workbook.SaveToFile(excel_file, ExcelVersion.Version2013)
    
    # HTMLに変換
    html_file = f"Sales_Report_{datetime.now().strftime('%Y%m%d')}.html"
    options = HTMLOptions()
    options.ImageEmbedded = True
    sheet.SaveToHtml(html_file, options)
    
    workbook.Dispose()
    
    print(f"Excelレポートを生成しました:{excel_file}")
    print(f"HTMLレポートを生成しました:{html_file}")
    return html_file

# レポート生成を実行
generate_sales_report()

説明:

  • 日付情報を含む動的ファイル名を使用し、バージョン管理を容易に
  • フォーマットされたタイトルとヘッダーを追加し、レポートの専門性を向上
  • 異なる数値書式を設定し、金額とパーセンテージを読みやすく表示
  • 自動的に合計行を計算して追加
  • ExcelとHTMLの両方の形式を同時に生成し、異なるニーズに対応

拡張方向:

  • メール送信機能を追加し、HTMLレポートを関係者に自動送信
  • Webサーバーに統合し、オンラインレポート閲覧サービスを提供
  • 定時実行により、日報、週報、月報の自動生成を実現

まとめ

本記事の例を通じて、Pythonを使用してExcelファイルをHTML形式に変換する方法を理解できました。単一ワークシートの単純な変換から、ワークブック全体のバッチ処理、ストリーム出力の柔軟な応用まで、このプロセスは高度に自動化されており、企業レポート公開、データダッシュボード表示、オンラインドキュメント共有などのシナリオに特に適しています。

手動コピー&ペーストやオンライン変換ツールと比較して、Pythonベースのコード方式には以下の利点があります:

  • 書式の完全保持:元のフォント、色、罫線などのスタイルを自動保持
  • バッチ処理の高効率:複数のファイルを一度に処理でき、作業効率を大幅に向上
  • 高いカスタマイズ性:ニーズに応じて変換オプションと出力形式を調整可能
  • 統合の容易さ:自動化ワークフローやWebアプリケーションに簡単に組み込み可能

これを基盤に、より多くの機能を拡張できます:

  • 定時タスクと組み合わせ、日報、週報の自動生成と公開を実現
  • 社内システムに統合し、リアルタイムデータ閲覧機能を提供
  • スタイルカスタマイズを追加し、生成されるHTMLが企業のビジュアル規範により適合するように
  • データベースと組み合わせ、データ抽出からHTML公開までのエンドツーエンド自動化を実現

Excelデータのオンライン表示や自動化レポートのニーズを処理している場合、このPythonベースの変換ソリューションはあなたの仕事に顕著な向上をもたらすでしょう。

より高度な機能については、Free Spire.XLS for Python 公式ドキュメントを参照してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?