Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取由PHPExcel修改的.xls文件时xlrd崩溃_Php_Python_Phpexcel_Xlrd - Fatal编程技术网

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

读取由PHPExcel修改的.xls文件时xlrd崩溃,php,python,phpexcel,xlrd,Php,Python,Phpexcel,Xlrd,我在使用PHP和python编辑一些Excel文件时遇到了极大的困难 我最初使用PHPExcel在PHP中完成所有操作,但当时我正在处理非常大的文件,PHPExcel在内存不足时崩溃。所以我改变了它,用PHP做了一些工作,剩下的用python做 因此,过程是: 解析发布到PHP脚本的xml 基于xml数据将行插入Excel(.xls)文件 将(.xls)文件和xml数据传递到python脚本以填充电子表格 例如,PHP调用的python upload.py Example.xls data.x

我在使用PHP和python编辑一些Excel文件时遇到了极大的困难

我最初使用PHPExcel在PHP中完成所有操作,但当时我正在处理非常大的文件,PHPExcel在内存不足时崩溃。所以我改变了它,用PHP做了一些工作,剩下的用python做

因此,过程是:

  • 解析发布到PHP脚本的xml
  • 基于xml数据将行插入Excel(.xls)文件
  • 将(.xls)文件和xml数据传递到python脚本以填充电子表格
  • 例如,PHP调用的python upload.py Example.xls data.xml
  • 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
有人能解释一下吗?该文件没有损坏,因为在Excel中打开它可以正常工作,但xlrd似乎无法读取它

我的PHP脚本执行以下操作(草图):

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

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


编辑:我创建了一个示例,基本上使用了我的excel文件并删除了所有标识信息。要亲自尝试,请参阅要点。

我的一个
.xls
文件出现了相同的错误(excel可以很好地打开它们,但xlrd失败)。我猜
Compdoc.seen
array跟踪已经读取的“FAT”扇区。在我的例子中,根条目读取块(SSCS)将所有的扇区标记为可见,这将导致将来出现异常。您可以尝试在读取逻辑的扇区中找到错误,并为xlrd:)做出贡献,或者只对这一行进行注释,添加异常raise,这可能会解决您的问题(就像在我的例子中一样),然后等待xlrd更新。

对于需要远程服务数据的绑定中的任何人来说,这是一种黑客行为,但注释掉第419行(
raise CompDocError)(
compdoc.py
中的“%s损坏:seen[%d]==%d”%(qname,s,self.seen[s])
)似乎工作正常。

只有在
self.seen[s]:
计算结果为
True
时才会引发异常。因此打印
self.seen[s]
s
并查看文件中的何处阻塞。然后用这些详细信息更新您的问题。您的意思是修改xlrd文件以执行此操作吗?如果查看错误,s为2,则显示
工作簿损坏:已查看[2]==4
啊。我错过了打印信息的
xlrd
了。你需要开始使用
xlrd
来调试它。可能是Excel文件无效,但Excel足够聪明,无论如何都可以打开它。这将最终落入
xlrd
phpexcel
之间的无人地带。我不知道如何打开它tiviated开发人员将对此进行调查,但您可能希望创建一个小示例并提交一份错误报告。关于这个问题有什么消息吗?您可以将此excel上传到某个地方进行测试和调试吗?@EricAmorde这似乎是一个PHPExcel问题。我检查了,它发现了与xlrd相同的问题。长话短说,该文件使用了c调用了Container格式,表似乎与标准不一致。Excel必须对这些问题有一定的鲁棒性。问题是它不是xlrd,而是PHPExcel。查看我问题的注释线程-我已经使用xls和xlsx文件以及两个不同的python Excel库对其进行了测试,另一个用户使用javascr对其进行了测试ipt xls解析器,所有这些解析器上都出现了相同的损坏。我尝试查看PHPExcels insert row函数,但这有点过头了。我可能会再看一看。也许你应该避免使用PHPExcel,让python xlrd完成所有工作。只需从一开始就将输入数据传递给python。至于修改文件,可能是第一种方法是从现有文件中读取数据并创建新文件并粘贴数据。不要修改-这很棘手。是的,正如我在另一篇评论中所述,我已经开始使用xlsx writer从头开始生成文件。我不再使用PHPExcel或修改任何现有文件。
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]))
$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");