🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

2620閲覧

Python 定型のエクセルデータ(.xlsx)からリスト(.xlsx)を作成しようとした所、エラーとなってしまう

inocchi1225

総合スコア4

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2021/02/11 07:38

前提・実現したいこと

Python初心者で勉強中です。

(実現したいこと)
定型のエクセルデータ(.xlsx)をまとめて読み込みリスト化もの(エクセルファイル(.xlsx))を作成しようとしています。

(前提状況)
・複数の関係者が、各自に配付された定型のエクセルデータに必要時事項を入力、それぞれが所定のシステムツールに
アップロード(エクセル形式(.xlsx))する。
・関係者がアップロードした定型のエクセルデータは、こちら側で、上記システムツールからZIPファイルとして
一括でダウンロードする形で入手できる(まとめてのダウンロードは、ZIP形式のみとなる。エクセル形式(.xlsx)での
ダウンロードは、一応可だが、その場合は1ファイルずつダウンロードする必要がある)。
・一括でダウンロードしたZIPファイルに格納されたエクセルファイルの形式は全て「.xlsx」となっている(確認済み)。

発生している問題・エラーメッセージ

ダウンロードしたZIPファイルに格納されている定型のエクセルデータ(.xlsx)を格納先のフォルダ(プログラムコード中の
「dl_data」フォルダ)に格納の上、以下のコードを実行した所、コンソールに以下のエラーメッセージが表示され、
実行できませんでした。

Traceback (most recent call last):

File "D:\Users\●●.spyder-py3\files\code\make_submissionllist_from_submittedexcelformats.py", line 24, in <module>
wb = load_workbook(pass_obj)

File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 313, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,

File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 124, in init
self.archive = _validate_archive(fn)

File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 96, in _validate_archive
archive = ZipFile(filename, 'r')

File "C:\ProgramData\Anaconda3\lib\zipfile.py", line 1268, in init
self._RealGetContents()

File "C:\ProgramData\Anaconda3\lib\zipfile.py", line 1335, in _RealGetContents
raise BadZipFile("File is not a zip file")

BadZipFile: File is not a zip file

該当のソースコード

Python

1import pathlib 2from openpyxl import load_workbook 3import datetime 4import os 5os.chdir('C:\Users\●●\.spyder-py3\files') 6 7filepath3 = '.\【フォーマット】修士論文提出状況一覧.xlsx' 8 9wb3 = load_workbook(filename = filepath3) 10ws3 = wb3['●提出状況'] 11 12list_row = 2 13 14path = pathlib.Path('.\dl_data') 15for pass_obj in path.iterdir(): 16 if pass_obj.match('*.xlsx'): 17 wb = load_workbook(pass_obj) 18 ws4 = wb['①基本情報'] 19 ws5 = wb['②ユーザー入力用'] 20 21 ws3.cell(list_row, 4).value = ws4.cell(6, 3).value 22 ws3.cell(list_row, 5).value = ws4.cell(7, 3).value 23 ws3.cell(list_row, 6).value = ws4.cell(8, 3).value 24 ws3.cell(list_row, 7).value = ws4.cell(9, 3).value 25 ws3.cell(list_row, 8).value = ws4.cell(10, 3).value 26 ws3.cell(list_row, 9).value = ws4.cell(11, 3).value 27 ws3.cell(list_row, 10).value = ws4.cell(17, 3).value 28 ws3.cell(list_row, 11).value = ws4.cell(20, 3).value 29 ws3.cell(list_row, 12).value = ws4.cell(21, 3).value 30 ws3.cell(list_row, 13).value = ws4.cell(24, 3).value 31 ws3.cell(list_row, 14).value = ws5.cell(29, 4).value 32 ws3.cell(list_row, 15).value = ws5.cell(30, 4).value 33 ws3.cell(list_row, 16).value = ws5.cell(32, 4).value 34 ws3.cell(list_row, 17).value = ws5.cell(33, 4).value 35 ws3.cell(list_row, 18).value = ws5.cell(44, 4).value 36 ws3.cell(list_row, 19).value = ws5.cell(45, 4).value 37 38 list_row += 1 39 40 41now = datetime.datetime.now() 42wb3.save('.\提出状況一覧' + now.strftime('%Y%m%d_%H%M%S') + '.xlsx')

試したこと

・数あるエクセルデータ(.xlsx)の内、エラーの原因と思しきエクセルデータ(.xlsx)は一部のみで、
ほとんど(9割程度)は、上記コードで問題なく実行できる(リスト化できる)。
・エラーの原因と思しきエクセルデータ(.xlsx)を、改めて自身のPCのデスクトップ上で上書き保存(.xlsx)し
所定のフォルダ(先述の「dl_data」フォルダ)に格納した所、上記コードで問題なく実行できる(リスト化できる)。

補足情報(FW/ツールのバージョンなど)

anacondaで作成した仮想環境のspyderで実行した
Windows 10
Anaconda 2020年7月版
python 4.1.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

検索すると下記などがひっかかります。理由としては、下記が考えられるようで、駄目なファイルをexcelで開いて保存する(自動化したいならxlwingsとか?)など対処が必要なようです。

  • xlsファイルは開けない
  • xlsファイルを拡張子だけxlsxに書き換えたものも開けない
  • 何らかの理由でファイルが破損していてもダメ

python openpyxl error

openpyxl以外で開いてみるのもアリかもしれません。
PythonでExcelファイルを扱うライブラリの比較

xlrd

xls, xlsxファイルの読み込み
xlwt
xlsファイルの書き込み(作成・保存)
openpyxl
xlsxファイルの読み込み・書き込み(作成・保存)
読み書きができるので既存のファイルに追記する場合に便利
pandas
xls, xlsxファイルの読み込み・書き込み(作成・保存)
上記のライブラリを内部で使っている

投稿2021/02/11 07:53

編集2021/02/11 07:55
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inocchi1225

2021/02/11 09:42

早速のご回答、ありがとうございます。深く感謝いたします。駄目なファイルは、xlsxとしてもxlsとしても認識していない様で、冒頭でご指摘の通り、やはり何らかの方法でexcelを開いてxlsxで保存し直すしか無い様です。pythonではxlwingsしか方法が無い様でしたら、今回は(時間がないので)諦めたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問