ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
Excel インストール不要!純 Python で .xls / .xlsx のアクティブシートを取得する方法
Kitaru
4 months
はじめに
Python で新しい形式の .xlsx ファイルは、定番ライブラリ openpyxl を使うと簡単にアクティブシートが取得できます。
しかし、古い .xls 形式になると情報が少なくて困ったり、どのライブラリを使えば良いか悩んだ方も多いのではないでしょうか。
この記事では、Windows 環境で Excel がインストールされていなくても動作する純 Python 構成で、.xls と .xlsx の両方に対応し、アクティブシートを自動検出して pandas の DataFrame に変換する方法をご紹介します。
初心者の方でも理解しやすいように、コードの説明も丁寧に行っていますのでご安心ください。
使用パッケージ
| パッケージ | 用途 | 備考 |
|---|---|---|
openpyxl |
.xlsx のアクティブシートを取得する | .xlsx のみ対応 |
xlrd |
.xls のアクティブシートを取得する | .xls のみ対応 |
pandas |
Excel ファイルのシートを読み込む | .xls / .xlsx 両形式に対応 |
⚠️ openpyxl は .xlsx しかサポートしていないため、.xls ファイルの処理には xlrd を使用します。
環境構築(Windows PowerShell例)
# Python のインストール確認 PS> python --version Python 3.13.3 # 仮想環境を作成 PS> python -m venv .venv # 仮想環境を有効化 PS> .\.venv\Scripts\activate # pip のアップグレード (.venv) PS> python -m pip install --upgrade pip # 必要なパッケージをインストール (.venv) PS> python -m pip install openpyxl xlrd pandas # 任意で Jupyter Notebook のインストール (.venv) PS> python -m pip install notebook
.xlsx 形式のアクティブシート取得方法
まずは新しい形式 .xlsx の場合です。
import pandas as pd
from openpyxl import load_workbook
file_path = 'sample.xlsx'
# openpyxlでExcelファイルを読み込み
wb = load_workbook(file_path)
sheet_name = wb.active.title # アクティブシートの名前を取得
wb.close()
# pandasでアクティブシートを読み込み
df = pd.read_excel(file_path, sheet_name=sheet_name, header=None)
# 表示(Jupyter用)
print("=== アクティブシート名 ===")
display(sheet_name)
print("\n=== データフレームの先頭5行 ===")
display(df.head())
解説
load_workbook()で Excel ファイルを読み込みます。wb.active.titleで現在アクティブなシート名を取得します。pandas.read_excel()を使い、そのシートの内容を DataFrame に読み込みます。
.xls 形式のアクティブシート取得方法
古い形式 .xls の場合は、xlrd を使ってアクティブシートを特定します。
import pandas as pd
import xlrd
file_path = 'sample.xls'
# xlrdでExcelファイルを読み込み
book = xlrd.open_workbook(file_path)
# アクティブシート(sheet_visible == 1)を取得
sheet_name = None
for sheet in book.sheets():
if sheet.sheet_visible == 1:
sheet_name = sheet.name
break
if sheet_name is None:
raise ValueError("アクティブシートが見つかりませんでした。")
# pandasでアクティブシートを読み込み
df = pd.read_excel(file_path, sheet_name=sheet_name, header=None)
# 表示(Jupyter用)
print("=== アクティブシート名 ===")
display(sheet_name)
print("\n=== データフレームの先頭5行 ===")
display(df.head())
解説
⚠️ ここが本記事の重要ポイントです。
Excel シートには次の 2つの属性 があります:
| 属性名 | 意味 |
|---|---|
sheet_selected |
「選択されているかどうか」を示すフラグ。複数のシートで 1(選択)になることもあります。 |
sheet_visible |
「ファイルを開いたときに最初に表示されるシートかどうか」を示す属性。1 ならそのシートがアクティブです。 |
sheet_selected は「ユーザーが現在選択しているシート」を示すフラグですが、Excel では複数のシートを同時に選択(グループ化)できるため、複数シートで sheet_selected == 1 となる可能性があります。
そのため、sheet_selected を使って単一のアクティブシートを特定することは信頼性に欠けます。
一方、sheet_visible == 1 は「Excel 起動時に最初に表示されるシート」を示しており、実質的にアクティブシートを一意に特定できる属性です。
このため、アクティブシートを特定するには sheet_visible == 1 のシートを取得するのが適切な方法となります。
.xls / .xlsx 両対応の実用サンプル
拡張子に応じて処理を自動で切り替えます。
from pathlib import Path
import pandas as pd
file_path = 'sample.xls' # または 'sample.xlsx'
# 拡張子を小文字で取得し、先頭のドットを除去
ext = Path(file_path).suffix.lower().lstrip('.')
if ext == 'xlsx':
# .xlsx ファイルの場合は openpyxl を使用してアクティブシート名を取得
from openpyxl import load_workbook
wb = load_workbook(file_path)
sheet_name = wb.active.title
wb.close()
elif ext == 'xls':
# .xls ファイルの場合は xlrd を使用してアクティブシート名を取得
import xlrd
book = xlrd.open_workbook(file_path)
sheet_name = next((s.name for s in book.sheets() if s.sheet_visible == 1), None)
if sheet_name is None:
raise ValueError("アクティブシートが見つかりませんでした。")
else:
raise ValueError(f"未対応の拡張子です: {ext}")
# pandasでアクティブシートを読み込み
df = pd.read_excel(file_path, sheet_name=sheet_name, header=None)
# 表示(Jupyterなど用)
print("=== アクティブシート名 ===")
display(sheet_name)
print("\n=== データフレームの先頭5行 ===")
display(df.head())
おわりに
.xlsx 形式のアクティブシート取得は、情報も豊富でスムーズに実装できますが、.xls 形式の場合は少し事情が異なります。
技術的には、.xls のアクティブシートを取得すること自体はそれほど難しくありません。
しかし、日本語でこの手法を詳しく解説した記事がほとんど見つからず、調査にかなりの時間を要しました。
最終的には、英語の Stack Overflow にある情報を手がかりに解決できたため、この記事として日本語で整理しました。
今回紹介した方法なら、Excel や LibreOffice をインストールすることなく、.xls / .xlsx 両形式を柔軟に扱うことができます。
バッチ処理やサーバー上での自動実行にも適しています。
初心者の方にもわかりやすく解説したつもりですので、ぜひ試してみてください。
役に立ったと感じたら、ブックマークやシェアもしていただけると嬉しいです。
コメントはありません。