xlsx和xlsm文件返回badzipfile:文件不是zip文件

49

我试图同时打开一个xlsx文件和一个xlsm文件,但是都给了我相同的错误:

badzipfile: 文件不是一个zip文件

这里是我输入的内容:

import openpyxl
wb=openpyxl.load_workbook('c:\\users\\me\\documents\\filename.xlsm', keep_vba=True)
wb2=openpyxl.load_workbook('c:\\users\\me\\documents\\filename2.xlsx')

两个load_workbook命令都导致同样的错误。它们都存在于那个位置。为什么我会得到这个错误?


它们都存在于那个位置。但它们是压缩文件吗? - Pekka
运行代码的用户是否可以访问这些位置的文件。还要使用“zipfile”库检查文件是否为zip文件。 - Charlie Clark
我在Ubuntu服务器上遇到了这个问题。在Windows上运行得很好,但是当我部署到我的服务器时,出现了这个问题。我尝试了crussell、ericksonla和Manish Chaudhary的答案,但都没有成功。我的.xlsx文件没有密码保护。 - C. S. F. Junior
@Pekka Excel文件是压缩文件。 - Steven
16个回答

21
相同的问题也发生在我身上,然后我注意到以下事项:
当我通过文件管理器创建 .xlsx 文件时,通过创建 .xlsx 格式的新文档,我遇到了相同的错误。但是当我使用某些电子表格软件 (例如libreoffice-calc),它可以正常工作。希望这可以帮助到您。

21

这是因为您创建了没有元数据的空 .xlsx 文件,它是一个没有单元格格式的空文件。请使用 Exel 或类似的电子表格软件将空文件保存在该目录中,这将创建一个具有单元格格式的 xlsx 文件,在保存后尝试使用 openpyxl 加载文件。


20

如果你使用文件对象调用 openpyxl.load_workbook 函数,请确保以二进制模式打开它。


谢谢!这就是我的问题。 - Chris W.
1
我该怎么做?我在load_workbook中没有看到可以将其设置为二进制模式的参数。 - Omega
请在Python文档中查找“二进制模式”的相关内容。 - Denis Eliseev
10
具体而言,myfile = open("path/to/file", "rb") 的意思是打开一个位于“path/to/file”路径下的文件,并以二进制模式读取该文件。 - shacker

7

我做了一件非常愚蠢的事情,结果得到了同样的错误。 基本上,今天是我第一次尝试这个功能,并且我用“自动化”示例使它工作了,然后尝试了我的Excel表格。 不起作用! 花了我一段时间才意识到错误是由于工作簿受到密码保护所致。 错误根本不匹配,但当我取消对工作簿的保护后,它成功了! 除了说“傻呀”和“耶!”之外,我还能说什么呢?


8
你能把这个转化成更像一个答案的形式吗? - Yunnosch
被点踩了。对答案没有任何帮助。 - Suraj Bhawal
请至少告诉我们您是如何取消文件保护的。 - pRo

6
您尝试打开的 XLSX 或 XLS 或 XLSM 文件是以“~”开头的 Excel 恢复文件。您可以通过以下方式进行检查:
for file in path.glob('*.xlsx'):print(file)

你可以通过检查并从完整路径中获取文件名来跳过这些文件:

filename=str(filename).split("\\")[-1:][0]

检查文件名是否以“~”开头,因为所有恢复文件都将以“~”开头

if filename[0]!="~"

文件中的波浪线是我的问题(自动备份文件)。谢谢。 - gimmegimme

5

虽然有点晚了,但是我也遇到了同样的错误,但原因不同。

在我的 Mac 上,当我将 .xlsx 文件剪切并粘贴到想要保存的目录中时,它实际上并没有放置文件本身,而是放置了一个符号链接。由于某种原因,这会引发相同的错误。我通过打开文件并使用“另存为”来解决了这个问题。


4
这与Python有什么关联? - JJJ
11
因为我在我的 Mac 上使用 openpyxl 时收到了相同的错误提示,而 openpyxl 是一个 Python 库,所以......(注:原文中写错了库名,应该是 openpyxl 而不是 openpxl)。 - BryanE

4

xlsx文件可能有密码保护,您无权访问。 删除密码后,您可以使用openpyxl.load_workbook()函数访问该文件。


嗨,Lucida Lee,欢迎来到StackOverflow!你的答案可能已经被[Will Johnson|https://dev59.com/W1sX5IYBdhLWcg3wY-vX#50475794]给出了。你可以点赞他的答案,并在这种情况下编辑他的答案(因为它可以改进)。这比添加重复的答案要好 :) - Nander Speerstra

3
我曾经遇到过同样的问题。这是因为我试图在 Python 中打开的文件已经在运行中了。你需要检查一下你想要在 Python 中打开的文件是否正在任务中运行。

3

我猜测你的 openpyxl 版本不是最新的(2.3.1),或者你的源文件存在问题。要升级到最新版本的 openpyxl,请使用以下命令:

pip install openpyxl --upgrade

源文件是否被加密了?

2
文件已加密。我猜你问这个问题是因为这会成为一个问题? - zw1ck
是的,那就是你问题的根源。Openpyxl不支持受密码保护的文件。 - crussell

2
当我将openpyxl指向文件的别名而不是原始文件时,我也遇到了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接