0

我正在使用 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 文件并保存到新文件。问题会消失。

以防其他人遇到同样的问题,我在这里发布。

4

2 回答 2

1

如果您有一个在 Excel、OpenOffice Calc 或 Gnumeric 中可以正常打开的 xls 文件,但不是由 xlrd 打开,那么您应该将详细信息和文件,这样可以改进xlrd;这将使您和所有其他 xlrd 用户受益。

检查源后更新:

您提供的堆栈跟踪来自古老的 0.6.1 版本;你到底为什么要使用它?

根据我对代码的阅读,xlrd 应该发出这样的消息:“警告*文件大小 (SIZE) 不是 512 + 扇区大小的倍数 (512)”……是吗?

这已经不合规格了。通常原因是数据有效负载(工作簿流)不是 512 字节的倍数,它是最后写入的结构,并且写入者没有费心去填充它。在这种情况下,继续是安全的,因为丢失的填充将不会被访问。

但是,在 xlrd 落在文件末尾的情况下,它遵循一串索引扇区(MS 称之为“双重间接 FAT”),当文件大小大于约 7 MB 时使用该链。每个扇区的最后 4 个字节包含链中下一个扇区的扇区号(或特殊的链结束值)。因此,如果这些扇区之一短于 512 字节,则文件已损坏。在没有警告消息的情况下从中恢复并不是我所说的良好行为,也不是我提倡 SO 用户依赖的东西。

请通过电子邮件与我联系,讨论如何获取此文件的副本(如有必要,根据保密协议)。

于 2012-02-08T01:31:17.273 回答
0

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

于 2018-12-14T09:17:37.033 回答