我正在使用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
我用Google搜索,发现这个建议有所帮助:
打开办公室的xls文件并保存到新文件。问题就会消失。
以防其他人遇到同样的问题,我在这里发布。
答案 0 :(得分:1)
如果你有一个xls文件在Excel,OpenOffice Calc或Gnumeric中打开OK,但是没有被xlrd打开,那么你应该通过电子邮件发送xlrd作者(在lexicon dot net上的sjmachin)的详细信息和文件的副本,以便可以改进xlrd;这将使您和所有其他xlrd用户受益。
检查来源后更新:
您提供的堆栈跟踪来自古老的0.6.1版本;为什么你在使用它?
根据我对代码的解读,xlrd应该发出如下消息:`WARNING * 文件大小(SIZE)不是512 +扇区大小的倍数(512)'...它?
这已经超出了规范。通常原因是数据有效负载(工作簿流)不是512字节的倍数,它是写入的最后一个结构,并且编写者没有费心去填充它。在这种情况下,可以继续安全,因为将无法访问缺少的填充。
但是,在xlrd从文件末尾掉落的情况下,它遵循一系列索引扇区(MS称之为“双间接FAT”),当文件大小大于约7 MB时使用。每个扇区中的最后4个字节包含链中下一个扇区的扇区号(或特殊的链末端值)。因此,如果其中一个扇区短于512字节,文件已损坏。在没有警告信息的情况下从中恢复不是我称之为良好行为的东西,而不是我提倡SO用户依赖的东西。
请通过电子邮件与我联系,讨论如何获取此文件的副本(根据保密协议,如有必要)。
答案 1 :(得分:0)
在通过提供程序以程序创建的XLS上运行xlrd
时,我也遇到了这个问题。
我的解决方案是运行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