Excel xlsxファイルのサポートエラー: xlrd.biffh.XLRDErrorの解決方法
問題の概要
Pythonでpandas.read_excel()
を使用してExcelファイル(特にマクロ有効ファイル.xlsm)を読み取ろうとすると、次のエラーが発生することがあります:
xlrd.biffh.XLRDError: Excel xlsx file; not supported
このエラーは、ローカル環境では正常に動作するコードが、本番環境(この場合はPCF - Pivotal Cloud Foundry)でデプロイされた際に発生するケースが多く見られます。
エラーの原因
このエラーの根本的な原因は、xlrdライブラリのバージョン2.0.0以降での大きな仕様変更にあります:
重要
xlrd 2.0.0以降、.xlsxファイル(.xlsmを含む)のサポートが明示的に削除されました
xlrdは現在、従来の.xls
形式のファイルのみをサポートしており、新しい.xlsx
や.xlsm
形式のファイルには対応していません。
推奨される解決方法
方法1: openpyxlエンジンの使用(推奨)
最も安全で現代的な解決策は、openpyxl
エンジンを明示的に指定してPandasを使用することです。
import pandas as pd
import os
# openpyxlエンジンを明示的に指定
df1 = pd.read_excel(
os.path.join(APP_PATH, "Data", "aug_latest.xlsm"),
engine='openpyxl'
)
必要な手順:
- 最新版のPandasをインストール(少なくとも1.0.1以上、可能なら最新版)
- openpyxlをインストール:bash
pip install openpyxl
- コード内で
engine='openpyxl'
を明示的に指定
方法2: 代替ライブラリの使用
openpyxl
以外にも、.xlsx
ファイルを扱えるライブラリがあります:
pip install openpyxl
pip install xlwings
pip install pyxlsb # バイナリExcelファイル用
非推奨の回避方法
セキュリティ警告
古いバージョンのxlrd(1.2.0)を使用する方法は強く非推奨です
互換性の問題から、一部の記事では古いバージョンのxlrdをインストールする方法が提案されています:
pip install xlrd==1.2.0
しかし、この方法には重大なセキュリティリスクが伴います。xlrd 1.2.0には既知の脆弱性があり、悪意のあるExcelファイルを処理する際にセキュリティ問題を引き起こす可能性があります。
まとめ
方法 | 推奨度 | メリット | デメリット |
---|---|---|---|
openpyxlを使用 | ⭐⭐⭐⭐⭐ | 安全、現代的なサポート | 追加ライブラリが必要 |
他のエンジンを使用 | ⭐⭐⭐⭐ | 状況に応じて最適化可能 | ライブラリごとの学習コスト |
xlrd 1.2.0にダウングレード | ⭐ | 簡単 | 重大なセキュリティリスク |
ベストプラクティス: 常にengine='openpyxl'
を明示的に指定し、最新のPandasとopenpyxlを使用しましょう。これにより、セキュリティを担保しながら.xlsx
や.xlsm
ファイルを安全に処理できます。