web-dev-qa-db-ja.com

PHPExcelを使用してスプレッドシートを読む

スプレッドシートをアップロードし、PHPExcelを使用してMySQLデータベースに読み込もうとしています。

.xlsxファイルの場合は正常に機能しますが、.odsファイルをアップロードしようとすると、エラーがスローされます:PHP致命的なエラー:PHPExcel_1の非オブジェクトでメンバー関数getNamespaces()を呼び出す.7.9/Classes/PHPExcel/Reader/OOCalc.php(341行目)

何が問題なのですか?

HTMLフォーム:

<form method="post" enctype="multipart/form-data">
Upload File: <input type="file" name="spreadsheet"/>
<input type="submit" name="submit" value="Submit" />
</form>

PHP(同じファイル内):

//Check valid spreadsheet has been uploaded
if(isset($_FILES['spreadsheet'])){
if($_FILES['spreadsheet']['name']){
    if(!$_FILES['spreadsheet']['error'])
    {

        $inputFile = $_FILES['spreadsheet']['name'];
        $extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
        if($extension == 'XLSX' || $extension == 'ODS'){

            //Read spreadsheeet workbook
            try {
                 $inputFile = $_FILES['spreadsheet']['tmp_name'];
                 $inputFileType = PHPExcel_IOFactory::identify($inputFile);
                 $objReader = PHPExcel_IOFactory::createReader($inputFileType);
                 $objPHPExcel = $objReader->load($inputFile);
            } catch(Exception $e) {
                    die($e->getMessage());
            }

            //Get worksheet dimensions
            $sheet = $objPHPExcel->getSheet(0); 
            $highestRow = $sheet->getHighestRow(); 
            $highestColumn = $sheet->getHighestColumn();

            //Loop through each row of the worksheet in turn
            for ($row = 1; $row <= $highestRow; $row++){ 
                    //  Read a row of data into an array
                    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
                    //Insert into database
            }
        }
        else{
            echo "Please upload an XLSX or ODS file";
        }
    }
    else{
        echo $_FILES['spreadsheet']['error'];
    }
}
}

?>
9
baarkerlounger

ファイルがWebサーバーにアップロードされると、ファイルはランダムな名前でシステムの一時フォルダーに保存されます。

あなたがやろうとしていたのは、アップロードしたファイルの実際のnameを与えることでしたが、ファイルはtmpフォルダーにランダムな名前で作成されたためです。代わりにtmp_nameを使用する必要があります。これは、実際にはそのランダムな名前のファイルを指します。

また、nameにはアップロードされたファイルの名前のみがあり、パスはありませんが、tmp_nameを使用すると、ファイルへの実際のパスがあります。

次のファイルアップロードの例を参照してください。

array(
 [UploadFieldName]=>array(
    [name] => MyFile.jpg
    [type] => image/jpeg
    [tmp_name] => /tmp/php/php6hst32
    [error] => UPLOAD_ERR_OK
    [size] => 98174
  )
)

代わりにコードをこれに変更してください

 //Check valid spreadsheet has been uploaded
if(isset($_FILES['spreadsheet'])){
if($_FILES['spreadsheet']['tmp_name']){
if(!$_FILES['spreadsheet']['error'])
{

    $inputFile = $_FILES['spreadsheet']['tmp_name'];
    $extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
    if($extension == 'XLSX' || $extension == 'ODS'){

        //Read spreadsheeet workbook
        try {
             $inputFileType = PHPExcel_IOFactory::identify($inputFile);
             $objReader = PHPExcel_IOFactory::createReader($inputFileType);
                 $objPHPExcel = $objReader->load($inputFile);
        } catch(Exception $e) {
                die($e->getMessage());
        }

        //Get worksheet dimensions
        $sheet = $objPHPExcel->getSheet(0); 
        $highestRow = $sheet->getHighestRow(); 
        $highestColumn = $sheet->getHighestColumn();

        //Loop through each row of the worksheet in turn
        for ($row = 1; $row <= $highestRow; $row++){ 
                //  Read a row of data into an array
                $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
                //Insert into database
        }
    }
    else{
        echo "Please upload an XLSX or ODS file";
    }
}
else{
    echo $_FILES['spreadsheet']['error'];
}
}
}

?>
14
Nicolas Racine

私の場合、この行の拡張子の検出中にエラーが発生しました

$extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));

解決する必要がある場合は、nameパラメーターから確認してください

$extension = strtoupper(explode(".", $_FILES['spreadsheet']['name'])[1]);

残りは働いていますありがとう:)

1