1

私はこの問題を約 1000 通りの方法で解決しようとしました。他の誰かが問題を見つけることができれば感謝します。

複数の Excel シートを生成してディスクに保存する PHPExcel を使用するコードがあります。

MS Excel 2010 を使用して 2 番目のファイル以降のすべてを開くと、"Excel は FILENAME に読み取り不可能なコンテンツを検出しました。このブックのコンテンツを復元しますか?" というエラーが表示されます。ファイルは「回復」され、完全に正常に動作します。OPEN Office で開いてもエラーは発生しません。

これは、コードの簡略化されたバージョンです。

<?php
$filenames = array("filenames go here");

$sheet1 = PHPExcel_IOFactory::load($template1);
$writer1 = new PHPExcel_Writer_Excel2007($sheet1);
$writer1->save('somefilename.xlsx');
//This file opens without problem
$sheet1->disconnectWorksheets();
unset($sheet1);
unset($writer1);

$i = 0;
foreach($filenames as $file){
    $template = "template2.xlsx";
    $fileName = 'filename' . $i . ' .xlsx';
    $spreadsheet = PHPExcel_IOFactory::load($template);
    $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet);
    $objWriter->save($fileName);
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
    //This file throws error when opened in Excel 2007+
    $i++;
 }
?>

次のことを確認しました。

  1. ファイルを破損する明らかなphpエラーメッセージ、空白、または無関係な入力はありません。
  2. テンプレート ファイルは Excel 2010 で正常に開きます。
  3. さまざまな PHPExcel ライター メソッドを使用してみましたが、すべて同じ問題が発生します。

実際のコードは余分な処理を大量に実行しますが、コメントアウトすることで責任がないことを確認しました。上記のコードは、問題が発生する唯一の場所のようです。

どんな提案もありがたく受け取った。

====EDITED==== これは Excel によって生成されたエラー ログです。

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
     <logFileName>error049120_01.xml</logFileName>
     <summary>Errors were detected in file 'C:\Users\USERNAME\AppData\Local\Temp\FILENAME.xlsx'</summary>
     -<additionalInfo>
           <info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info>
     </additionalInfo>
</recoveryLog>
4

5 に答える 5

9

ファイルに同様のエラーがあり、Andrey Yanko が投稿した推奨事項に従いましたが、それでも同様のエラーが発生しました。別の投稿で提案を見つけ、追加することで

"出口;"

残りのエラーを削除するのに役立つスクリプトの最後に

于 2015-11-18T15:43:44.840 に答える
4

このバグは、php.ini の構成 mbstring.func_overload に関連していました。回避策を使用してこのバグを回避できます - スクリプトの先頭に追加するだけです:

if (function_exists('mb_internal_encoding')) {
    $oldEncoding=mb_internal_encoding();
    mb_internal_encoding('latin1');
}

そして最後に:

if (function_exists('mb_internal_encoding'))
    mb_internal_encoding($oldEncoding);

それは私を助けたので、あなたにも役立つと信じています。

于 2013-11-29T07:36:06.597 に答える
2

明らかな問題:

$sheet1 = PHPExcel_IOFactory::load($template1);
$writer1 = new PHPExcel_Writer_Excel2007($sheet1);
$writer1->save(sheet1);

save($sheet1)- $sheet1 はファイル名ではなく、PHPExcel オブジェクトであり、完全なワークブックです... save メソッドは、保存するファイル名を引数として期待します

foreach($filenames as $file){
    $template = "template2.xlsx";
    $fileName = 'filename.xlsx';
    $spreadsheet = PHPExcel_IOFactory::load($template);
    $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet);
    $objWriter->save($fileName);
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
}

各ループは同じファイル名を使用して保存し、以前の反復からの保存を上書きします

MS Excel が読み取り不能なコンテンツについて警告し、それでもファイルを開く場合、通常、ファイルを読み取り可能にするために破棄されたものを通知します... しかし、そのメッセージを知らなかったり、実際のファイルのコピーを確認したりしなければ、解決することはできません。あなた。

于 2013-03-03T21:52:42.560 に答える
1

それを保存してい.xlsない可能性があり.xlsxますか?

.xlsxhave に名前を変更した new を開く.xlsと、同様の警告が表示されます。

于 2013-03-03T21:37:00.527 に答える
0

このバグは、私が「テンプレート」として使用していた個々の xlsx ファイルに関連していたようです。代わりに別のファイルをテンプレートとして使用すると、コードは正常に機能します。

元のテンプレートが破損しているようには見えなかったため、どこかで PHPExcel が問題を引き起こしていましたが、どこにあるのかはわかりませんでした。

于 2013-03-05T22:02:03.183 に答える