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ファイルを取得して、識別情報を削除しました。自分で試すには、ここの要点を参照してください。