5

PHP と Python を使用して一部の Excel ファイルを編集するのに非常に苦労しています。

私はもともとPHPExcelを使用してPHPですべてを行っていましたが、非常に大きなファイルを処理していて、メモリが不足したときにPHPExcelがクラッシュしました。そこで、PHP を使用して一部の作業を行い、残りを python を使用して行うように変更しました。

したがって、プロセスは次のとおりです。

  • PHPスクリプトに投稿されたxmlを解析する
  • xml データに基づいて Excel (.xls) ファイルに行を挿入する
  • (.xls) ファイルと xml データを Python スクリプトに渡して、スプレッドシートに入力します。
  • 元。python upload.py Example.xls data.xmlPHPによって呼び出されます
  • 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ファイルを取得して、識別情報を削除しました。自分で試すには、ここの要点を参照してください。

4

2 に答える 2

2

リモート サービスからのデータが必要なバインドにある人にとってはハックですが、419 行目 ( raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))) をコメント アウトすることはcompdoc.py問題ないようです。

于 2015-11-01T16:51:41.463 に答える