excel 对合法的.xlsx文件执行openpyxl load_workbook()会导致zipfile.BadZipFile错误

l0oc07j2  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(360)

我 试图 做 的 是 将 dataframe 数据 附加 到 一 个 现有 的 合法 excel 文件 中 。 我 使用 了 openpyxl 中 的 load _ workbook ( ) 函数 , 但 它 系统 地 返回 了 一 个 错误 。 下面 是 一些 在 我 的 机器 上 崩溃 的 代码 :

from openpyxl import load_workbook

report_path = root_folder + '\\log_report.xlsx'
writer = pd.ExcelWriter(report_path, engine='openpyxl')
writer.book = load_workbook(report_path)
writer.close()

中 的 每 一 个
在 这里 , log_report.xlsx 已经 存在 , 并 通过 pandas . to _ excel ( ) 创建 。 在 用 openpyxl load _ workbook ( ) 打开 之前 , 可以 打开 它 , 编辑 它 , 并 执行 MS Excel 允许 的 任何 操作 。 我 得到 了 以下 错误 返回 :

Traceback (most recent call last):
  File "D:/failsafe_counter/main.py", line 419, in <module>
    writer.book = load_workbook(report_path)
  File "D:\failsafe_counter\venv\lib\site-packages\openpyxl\reader\excel.py", line 315, in load_workbook
    reader = ExcelReader(filename, read_only, keep_vba,
  File "D:\failsafe_counter\venv\lib\site-packages\openpyxl\reader\excel.py", line 124, in __init__
    self.archive = _validate_archive(fn)
  File "D:\failsafe_counter\venv\lib\site-packages\openpyxl\reader\excel.py", line 96, in _validate_archive
    archive = ZipFile(filename, 'r')
  File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1269, in __init__
    self._RealGetContents()
  File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1336, in _RealGetContents
    raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file

格式
重要 的 方面 是 , 这个 操作 留下 了 最初 的 excel 文件 损坏 , 不 可能 再次 打开 。
初始 文件 是 一 个 合法 的 zip 文件 ( 通过 将 xlsx 重 命名 为 . zip 来 验证 ) 。 一旦 上面 的 小 代码 返回 错误 , 它 就会 将 Excel 文件 转换 为 一 个 空 的 存档 ( 通过 相同 的 过程 验证 ) 。
我 在 我 以前 的 笔记 本 电脑 上 ( 在 windows7 下 ) 成功 地 使用 了 这些 功能 , 但是 自从 我 迁移 到 windows10 下 后 , 我 就 不能 再 使用 它们 了 。
在 某些 配置 中 , openpyxl load _ workbook ( ) 是否 存在 已知 的 问题 ? 您 是否 知道 如何 修复 此 问题 , 或者 有 任何 解决 方法 ?

ajsxfq5m

ajsxfq5m1#

我能够复制这个问题。它是pandas相关的。在Pandas1.1.5之前一切都很好。在Pandas1.2.0中,他们做了some changes
当您使用

writer = pd.ExcelWriter(report_path, engine='openpyxl')`

它创建了大小为0字节的空文件并覆盖了现有文件,然后在尝试加载它时出现错误。它与openpyxl无关,因为最新版本的openpyxl在panda 1.1.5中运行良好。
解决方案-指定mode='a',将上面的行更改为

writer = pd.ExcelWriter(report_path, engine='openpyxl', mode='a')

或者-查看@CharlieClark解决方案或this solution,他们在示例化pd.ExcelWriter之前加载文件。

fv2wmkja

fv2wmkja2#

例外情况十分明显:openpyxl无法读取该文件,因为它不是zip文件。
pd.ExcelWriter(report_path, engine='openpyxl')创建了一个新文件,但由于这是一个完全空的文件,openpyxl无法加载它。如果你想在Pandas和openpyxl中处理一个文件,你必须创建一个“book”对象。

wb = load_workbook(report_path)
writer = pd.ExcelWriter(report_path, engine='openpyxl')
writer.book = wb
7kqas0il

7kqas0il3#

在我的情况下,当文件是 * 内部 * 在公司域(不是公共)的问题发生。

thtygnil

thtygnil4#

只需检查您在代码中使用的文件是否在Excel中打开。如果已打开,请关闭文件并再次运行代码。

相关问题