2

PHPExcel ライブラリを使用して PHP Web アプリケーションを開発しました。奇妙にExcelドキュメントとして認識できない一部のExcelドキュメントを除いて、すべてが正常に機能しています。これらのファイルを Microsoft Excel で開き、xls、csv、xlsx として保存すると、すべて正常に動作します。だから...一部のExcelファイルは、拡張子が正確に表示されていないと思います。おそらくそれらは XML を偽装しているのでしょうか? PHPExcel で XML サポートを取得することは可能ですか?

エラーは次のとおりです。

Fatal error: Uncaught exception 'PHPExcel_Reader_Exception' with message 'The filename /tmp/phphrnIR2 is not recognised as an OLE file' in /home/www/text/excel/reader/Classes/PHPExcel/Shared/OLERead.php:89 Stack trace: #0 /home/test/excel/reader/Classes/PHPExcel/Reader/Excel5.php(1164): PHPExcel_Shared_OLERead->read('/tmp/phphrnIR2') #1 /home/www/text/excel/reader/Classes/PHPExcel/Reader/Excel5.php(612): PHPExcel_Reader_Excel5->_loadOLE('/tmp/phphrnIR2') #2 /home/www/test/excel/actions.php(60): PHPExcel_Reader_Excel5->load('/tmp/phphrnIR2') #3 /home/www/test/excel/index.php(77): include_once('/home/www/test/ex...') #4 {main} thrown in /home/www/test/excel/reader/Classes/PHPExcel/Shared/OLERead.php on line 89

ファイル認識用のphpコード:

 $name     = $_FILES['file']['name'];
                    $tname    = $_FILES['file']['tmp_name'];
                    $type     = $_FILES['file']['type'];

                    if($type == 'application/vnd.ms-excel')
                    {
                            // Excel 97 extension
                            $ext = 'xls';
                    }
                    else if($type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
                    {
                            // Excel 2007 and 2010 extension
                            $ext = 'xlsx';
                    }


                    else if($type == 'text/csv')
                    {
                            // Excel CSV extension
                            $ext = 'csv';


                    }else{

                            // Invalid Extension   
                    ?> 
                            <script languaje="javascript">
                                  swal("Bad file...", "A valid extension must be XLS, XLSX o CSV!", "error");
                            </script> 
                            <?php
                            exit();
                    }
 //reader creation
                    $objReader = PHPExcel_IOFactory::createReader($$ext);

                    //uploading file
                    $objPHPExcel = $objReader->load($tname);


                    $dim = $objPHPExcel->getActiveSheet()->calculateWorksheetDimension();
4

2 に答える 2

2

拡張子は付いています.xlsが、BIFF 形式の xls ファイルではない可能性は十分にあります。

csv 形式のファイルや HTML マークアップの場合、多くの人がファイルに xls 拡張子を付けます。拡張子は決して信頼しません。また、MIME タイプはファイル拡張子に基づいているため、それを額面どおりに受け取ることはできません。

拡張子/MIME タイプに基づいて Reader を具体的に作成するのではなく、PHPExcel の IOFactory identify() メソッドを使用して、PHPExcel がファイルと見なすファイル形式を確認します。または、IOFactory の load() メソッドを呼び出して、それ自体のファイル形式を識別できるようにします。

明らかに、このファイルは BIFF 形式ではありません (または、BIFF 形式の非常に初期のバージョン (バージョン 5 より前) を使用して作成されたファイル) ではありません。それ以外の場合は、OLE ファイルとして認識されます。

于 2015-09-16T09:50:58.900 に答える
1

あなたが直面したのと同じ問題、匿名ユーザーに遭遇しました。これは私がそれを修正した方法です:

PHPExcel に型を検出させる

すばやく簡単にロード

require_once('Classes'.DIRECTORY_SEPARATOR.'PHPExcel.php');

// Tell PHPExcel to load this file and make its best guess as to its type.
$objPHPExcel = PHPExcel_IOFactory::load($_FILES['uploaded_file']['tmp_name']);

オプションでロード

require_once('Classes'.DIRECTORY_SEPARATOR.'PHPExcel.php');

// Tell PHPExcel that you will be loading a file.
$objReader = PHPExcel_IOFactory::createReaderForFile($_FILES['uploaded_file']['tmp_name']);

// Set your options.
$objReader->setReadDataOnly(true);

// Tell PHPExcel to load this file and make its best guess as to its type.
$objPHPExcel = $objReader->load($_FILES['uploaded_file']['tmp_name']);

ソース

PHPExcel オブジェクトができたので、次のようにワークシートを操作できます。

    foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
        $worksheets[] = $worksheet->toArray();
    }

    foreach($worksheets as $sheet) {

        foreach($sheet as $row) {
            print_r($row);
        }

    }
于 2015-11-20T23:56:36.437 に答える