pyinstallerでexeファイルを生成し、社内に配布しようと考えたが、xlrdでエラーがでてしまう。以下エラー内容

Traceback (most recent call last):
  File "test.py", line 15, in <module>
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\util\_decorators.py", line 296, in wrapper
    return func(*args, **kwargs)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\io\excel\_base.py", line 304, in read_excel
    io = ExcelFile(io, engine=engine)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\io\excel\_base.py", line 867, in __init__
    self._reader = self._engines[engine](self._io)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\io\excel\_xlrd.py", line 22, in __init__
    super().__init__(filepath_or_buffer)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\io\excel\_base.py", line 353, in __init__
    self.book = self.load_workbook(filepath_or_buffer)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\pandas\io\excel\_xlrd.py", line 37, in load_workbook
    return open_workbook(filepath_or_buffer)
  File "c:\users\user\anaconda3\envs\kasou\lib\site-packages\xlrd\__init__.py", line 170, in open_workbook
    from .biffh import biff_dump
xlrd.biffh.XLRDError: Excel xlsx file; not supported

上記のように仮想環境で生成したexeファイルを実行するとエラーが出力されてうまく動作しないエラーがでます。普通にPandasでread_excel関数を使っている箇所でエラーが発生していました。

xlrd.biffh.XLRDError: Excel xlsx file; not supportedの一文を見るとわかる通り、xlrdがExcelのxlsx拡張子のファイルに対応していないとのエラー内容のようです。

conda list

でxlrdのバージョンを確認すると、2.0.1でした。今回のエラーは、2020年12月11日にxlrdがバージョンアップデートされたみたいでそれ以降に発生するエラーのようです。xlrd公式を見るとxls以外の拡張子のExcelファイルには対応してないとのこと。

ただ、以前はうまく動作したので、試しにバージョンを下げてみることに…

conda install xlrd==1.2.0

再度pyinstallerでexe化すると実行成功しました。xlrd2.0.0でサポートを終了したみたいです。

また、xlrdライブラリの詳細については公式ドキュメントをご参照ください。

xlrd公式ドキュメント

このライブラリは、.xlsファイル以外のものを読み取ることはなくなります。新しいファイル形式を読み取る代替方法については、http://www.python-excel.org/を参照してください

上記xlrdライブラリの公式ドキュメントによれば、xlrdライブラリはxls以外のファイルを読み込まなくなったようです。そのため、比較的新しいxlsxなどのファイルは別のライブラリを使用して読み込む必要があります。

代替法の一つとして、openpyxlを使用する手法があります。pipインストールして、以下のように記述を変更することで対応できます。

df = pd.reaad_excel('テスト.xlsx',engine="openpyxl")
Masa
Witten by Masa

情報工学系学部卒のエンジニアです。メインはフロントエンドですが、そのほかにもPython,PHP,GAS,など色んな言語、開発、データ分析、マーケティングなど手広くやってます。