xlrd: struct.error: 解压缩需要长度为512的字符串参数

0 投票
2 回答
3007 浏览
提问于 2025-04-17 12:02

我之前用 xlrd 0.6.1 和 0.7.1 打开我的 xls 文件,结果两个版本都报错了:

Traceback (most recent call last):
  File "../../xls2csv.py", line 53, in <module>
    book = xlrd.open_workbook(args[0])
  File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 366, in open_workbook

  File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 760, in __init__

  File "build/bdist.linux-i686/egg/xlrd/compdoc.py", line 149, in __init__
struct.error: unpack requires a string argument of length 512

我在网上查了一下,发现有个建议挺有效的:

用 Open Office 打开这个 xls 文件,然后另存为一个新文件。这样问题就解决了。

为了防止其他人遇到同样的问题,我把这个方法分享在这里。

2 个回答

1

我在使用 xlrd 处理一个从供应商那里得到的程序生成的 XLS 文件时,也遇到了这个问题。

我的解决办法是用 libreoffice 来转换这个文件,之后我就能顺利地用 xlrd 处理这个文件了!

libreoffice --headless --convert-to xls --outdir converted original/not_working.xls

我在 Python3 中是这样做的:

from subprocess import call call(["libreoffice", "--headless", "--convert-to", "xls", "--outdir", "converted" , "original/not_working.xls"])

来源:

https://unix.stackexchange.com/questions/354043/convert-xlsx-to-xls-in-linux-shell-script#354054

https://www.computerhope.com/forum/index.php?topic=160219.0

1

如果你有一个xls文件,在Excel、OpenOffice Calc或Gnumeric中可以正常打开,但在xlrd中打不开,那么你应该给xlrd的作者发邮件(sjmachin at lexicon dot net),告诉他具体情况并附上文件,这样xlrd就可以得到改进;这对你和其他所有xlrd用户都有好处。

更新:在查看源代码后:

你提供的堆栈跟踪信息是来自古老的0.6.1版本;你为什么还在用这个版本呢?

根据我对代码的理解,xlrd应该会发出类似这样的警告信息:`WARNING * 文件大小(SIZE)不是512的倍数加上扇区大小(512)' ... 它有发出这样的警告吗?

这已经不符合规范了。通常原因是数据部分(工作簿流)不是512字节的倍数,它是最后写入的结构,而写入者没有填充它。在这种情况下,继续处理是安全的,因为缺失的填充不会被访问。

但是,在你的情况下,xlrd在文件末尾出错,是因为它在跟踪一个索引扇区链(微软称之为“双重间接FAT”),这个链在文件大小超过大约7MB时使用。每个扇区的最后4个字节包含下一个扇区在链中的扇区编号(或者一个特殊的结束链值)。因此,如果其中一个扇区短于512字节,文件就是损坏的。在没有任何警告信息的情况下恢复,这不是我认为的良好行为,也不是我会建议SO用户依赖的事情。

请通过电子邮件与我联系,讨论如何获取这个文件的副本(如果需要,可以签署保密协议)。

撰写回答