Excel ファイルとデータベース間でデータをエクスポートおよびインポートする機能は、データ管理において非常に重要です。Excel からデータベースへデータをエクスポートすることで、スケーラビリティやセキュリティが向上し、大規模データの効率的な処理や、同時アクセスを伴う共同作業が可能になります。一方、データベースから Excel にデータをインポートすることで、使い慣れたスプレッドシート環境でのデータ分析や可視化、プレゼンテーションが可能となり、複雑な情報もユーザーにとって扱いやすくなります。
本記事では、Python 言語の強力な機能を活用して、データベースと Excel ファイル間のデータ転送を自動化する方法を紹介します。具体的には、Spire.XLS for Python を使用し、SQLite データベースを例にして、データベースから Excel ファイルへのエクスポート、および Excel ファイルからデータベースへのインポートの方法を解説します。
Spire.XLS for Python のインストール
この操作には、Spire.XLS for Python と plum-dispatch v1.7.4 が必要です。これらは、Spire.XLS for Python の公式ウェブサイトから手動でダウンロードするか、以下の pip コマンドでインストールできます。
pip install Spire.XLS
Python で DB から Excel へデータ出力
Spire.XLS for Python は、Excel ブックの作成、読み込み、編集を行うための豊富なクラスやメソッド、プロパティを提供しています。Python 標準ライブラリの sqlite3 モジュールを使用してデータベースからデータを取得し、Spire.XLS で Excel ファイルを作成してデータを書き込むことで、データベースの内容を簡単にExcelにエクスポートできます。
具体的な手順は以下の通りです:
- データベースに接続します。
- Workbook クラスのインスタンスを作成し、初期状態のワークシートを削除します。
- データベース内の各テーブルをループ処理し、列名とデータを取得します。
- 各テーブルに対応するワークシートを Workbook.Worksheets.Add() メソッドで作成し、ヘッダー行に列名を、その他の行にデータを Worksheet.Range[].Value プロパティを使って書き込みます。
- ワークシートの体裁を整えます。
- Workbook.SaveToFile() メソッドでファイルを保存します。
- Python
from spire.xls import Workbook, FileFormat
import sqlite3
# データベースに接続
conn = sqlite3.connect("Data.db")
cursor = conn.cursor()
# データベース内のすべてのテーブル名を取得
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tableNames = [name[0] for name in cursor.fetchall()]
# Excel ファイルを作成
workbook = Workbook()
workbook.Worksheets.Clear()
# データベース内の各テーブルを処理
for tableName in tableNames:
# テーブルの列名を取得
cursor.execute(f"PRAGMA table_info('{tableName}')")
columnsInfo = cursor.fetchall()
columnNames = [columnInfo[1] for columnInfo in columnsInfo]
# テーブルのデータを取得
cursor.execute(f"SELECT * FROM {tableName}")
rows = cursor.fetchall()
# ワークシートを作成
sheet = workbook.Worksheets.Add(tableName)
# ヘッダーをワークシートに書き込む
for i in range(len(columnNames)):
sheet.Range[1, i + 1].Value = columnNames[i]
# データをワークシートに書き込む
for j in range(1, len(rows)):
column = rows[j]
for k in range(len(column)):
sheet.Range[j + 1, k + 1].Value = str(column[k])
# ワークシートをフォーマット
sheet.AllocatedRange.Style.Font.FontName = "Yu Gothic UI"
sheet.AllocatedRange.Style.Font.Size = 12.0
sheet.AllocatedRange.AutoFitRows()
sheet.AllocatedRange.AutoFitColumns()
# Excel ファイルを保存
workbook.SaveToFile("output/データベースをExcelへ出力.xlsx", FileFormat.Version2016)
workbook.Dispose()
conn.close()
Python で Excel から DB へデータ入力
Spire.XLS for Python は、Excel ファイルからさまざまな形式のデータを読み取る機能も備えており、読み取ったデータを sqlite3 を使ってデータベースに書き込むことが可能です。以下はその詳細な手順です:
- Workbook クラスのインスタンスを作成します。
- Workbook.LoadFromFile() メソッドで Excel ファイルを読み込みます。
- データベースに接続します。
- Excel ブック内の各ワークシートをループ処理します。
- Workbook.Worksheets.get_Item() メソッドでワークシートを取得し、Worksheet.Name プロパティでシート名を取得します。
- ヘッダー行のデータを Worksheet.Range[].Value プロパティで取得します。
- ワークシート名をテーブル名とし、ヘッダー行のデータを列名として、データベースにテーブルを作成します。
- ワークシートのセルからデータを取得し、対応するテーブルに書き込みます。
- 変更をコミットして接続を閉じます。
- Python
from spire.xls import Workbook
import sqlite3
# Workbook のインスタンスを作成
workbook = Workbook()
# Excel ファイルを読み込む
workbook.LoadFromFile("Sample.xlsx")
# データベースに接続
conn = sqlite3.connect("output/Report.db")
cursor = conn.cursor()
for s in range(workbook.Worksheets.Count):
# ワークシートを取得
sheet = workbook.Worksheets.get_Item(s)
# シート名を取得
sheetName = sheet.Name
sheetName = sheetName.replace(" ", "")
# ヘッダー行のデータを取得
header = []
for i in range(sheet.AllocatedRange.ColumnCount):
headerValue = sheet.Range[1, i + 1].Value
headerValue = headerValue.replace(" ", "")
header.append(headerValue)
# データベースのテーブルを作成
createTableSql = f"CREATE TABLE IF NOT EXISTS {sheetName} ({', '.join([f'{header[i]} TEXT' for i in range(len(header))])})"
cursor.execute(createTableSql)
# データをデータベースのテーブルに挿入
for row in range(1, sheet.AllocatedRange.RowCount):
data = []
for col in range(sheet.AllocatedRange.ColumnCount):
# セルの値を取得
value = sheet.Range[row + 1, col + 1].Value
data.append(value)
# セルの値をテーブルに挿入
insertSql = f"INSERT INTO {sheetName} ({', '.join(header)}) VALUES ({', '.join(['?' for _ in data])})"
cursor.execute(insertSql, data)
# 変更をコミットして接続を閉じる
conn.commit()
conn.close()
workbook.Dispose()
一時ライセンスを申請する
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。