我很难使用 PHP 和 python 编辑一些 Excel 文件。
我最初使用 PHPExcel 在 PHP 中完成了所有操作,但是我正在处理非常大的文件,并且 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 内存问题),我们将不胜感激。
编辑:可以在此处找到引发错误的文件的源代码。
编辑:我创建了一个示例,基本上拿走了我的 excel 文件并删除了任何识别信息。要自己尝试,请参阅此处的要点。