php 删除xls文件,读取PHPExcel修改的.xls文件时xlrd崩溃

我使用PHP和python编辑一些Excel文件非常困难.

我最初使用PHPExcel在PHP中做了所有事情,但我处理的是非常大的文件,当内存不足时PHPExcel崩溃了.所以我把它改成了用PHP做一些工作,然后用python做其余的工作.

所以这个过程是:

> Parse xml发布到PHP脚本

>根据xml数据将行插入Excel(.xls)文件

>将(.xls)文件和xml数据传递给python脚本以填充电子表格

>前. python upload.py Example.xls由PHP调用的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

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”扇区.在我的情况下,根条目读取块(SSCS)获取标记为所见的所有扇区,导致将来异常提升.你可以尝试在读取逻辑的扇区中找到错误并为xlrd做贡献:)或者只是通过异常提升来评论这一行,这可能会解决你的问题(就像我的一样)并等待xlrd更新.

标签:python,php,phpexcel,xlrd

来源: https://codeday.me/bug/20190517/1122366.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值