gpt4 book ai didi

php - 读取由 PHPExcel 修改的 .xls 文件时 xlrd 崩溃

转载 作者:可可西里 更新时间:2023-11-01 14:03:40 32 4
gpt4 key购买 nike

我在使用 PHP 和 python 编辑一些 Excel 文件时遇到了非常困难的事情。

我最初在 PHP 中使用 PHPExcel 完成了所有工作,但我正在处理非常大的文件,PHPExcel 在内存不足时崩溃了。所以我将其更改为使用 PHP 完成一些工作,并使用 python 完成其余工作。

所以流程是:

  • 解析发布到 PHP 脚本的 xml
  • 根据 xml 数据将行插入 Excel (.xls) 文件
  • 将 (.xls) 文件和 xml 数据传递给 python 脚本以填充电子表格
  • 例如。 python upload.py Example.xls data.xml PHP调用
  • python 脚本使用 xlrd、xlwt 和 xlutils 填充 Excel 文件

我遇到的问题是,如果 python 脚本修改了我手动创建的常规 .xls 文件,它会完美运行。但是一旦PHP excel修改Excel文件,python脚本就会产生如下错误:

_locate_stream(Workbook): seen
0 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
20 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
100= 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
120 4 4 4 4 4 4 4 4 4 4 4 4 4 3 2 2
File "upload.py", line 63, in <module>
workbook_readonly = open_workbook(excel,formatting_info=True,on_demand=True)
File "/home/student/eamorde/public_html/dining/xlrd/__init__.py", line 435, in open_workbook
ragged_rows=ragged_rows,
File "/home/student/eamorde/public_html/dining/xlrd/book.py", line 87, in open_workbook_xls
ragged_rows=ragged_rows,
File "/home/student/eamorde/public_html/dining/xlrd/book.py", line 619, in biff2_8_load
cd.locate_named_stream(UNICODE_LITERAL(qname))
File "/home/student/eamorde/public_html/dining/xlrd/compdoc.py", line 390, in locate_named_stream
d.tot_size, qname, d.DID+6)
File "/home/student/eamorde/public_html/dining/xlrd/compdoc.py", line 418, in _locate_stream
raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))
xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4

所以我翻遍了 xlrd 的源代码,找到了产生错误的行:

def _locate_stream(self, mem, base, sat, sec_size, start_sid, expected_stream_size, qname, seen_id):
# print >> self.logfile, "_locate_stream", base, sec_size, start_sid, expected_stream_size
s = start_sid
if s < 0:
raise CompDocError("_locate_stream: start_sid (%d) is -ve" % start_sid)
p = -99 # dummy previous SID
start_pos = -9999
end_pos = -8888
slices = []
tot_found = 0
found_limit = (expected_stream_size + sec_size - 1) // sec_size
while s >= 0:
if self.seen[s]:
print("_locate_stream(%s): seen" % qname, file=self.logfile); dump_list(self.seen, 20, self.logfile)
raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))

最后一行是引发异常的那一行:

raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))

谁能解释一下?该文件没有损坏,因为在 Excel 中打开它可以正常工作,但 xlrd 似乎无法读取它。

我的 PHP 脚本执行以下操作(粗略):

$phpExcel = new PHPExcel();
$file = "MyFile.xls";
$reader = new PHPExcel_Reader_Excel5();
$phpExcel = $reader->load($file);
//(... insert rows based on xml)
$writer = new PHPExcel_Writer_Excel5();
$writer->save('MyFile.xls');
exec("python upload.py MyFile.xls data.xml");

如果有人知道为什么会发生这种情况,或者知道我的问题(PHPExcel 内存问题)的更好解决方案,我们将不胜感激。

编辑:可以找到引发错误的文件的源代码 here .

编辑:我创建了一个例子,基本上是拿了我的 excel 文件并删除了任何识别信息。要亲自尝试,请参阅要点 here .

最佳答案

我的一个 .xls 文件出现了同样的错误(excel 可以很好地打开它们,但 xlrd 失败)。正如我猜测的那样,Compdoc.seen 数组跟踪已读取的“FAT”扇区。在我的例子中,根条目读取 block (SSCS) 将所有扇区标记为已看到,从而导致将来引发异常。你可以尝试在读取逻辑的扇区中找到错误并为 xlrd 做出贡献 :) 或者只是用异常 raise 评论这行,这可能会解决你的问题(就像我的情况一样)并等待 xlrd 更新。

关于php - 读取由 PHPExcel 修改的 .xls 文件时 xlrd 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618672/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com