Я пытаюсь загрузить электронную таблицу и прочитать ее в базе данных MySQL, используя PHPExcel.
Для файлов .xlsx он отлично работает, но всякий раз, когда я пытаюсь загрузить файл .ods, он выдает ошибку: PHP Fatal error: вызов функции-члена getNamespaces () для не-объекта в PHPExcel_1.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']; } } } ?>
Когда файл загружается на ваш веб-сервер, файл будет сохранен во временной папке вашей системы со случайным именем.
То, что вы пытались сделать, это указать фактическое 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']; } } } ?>
В моем случае была обнаружена ошибка, указывающая расширение в этой строке
$extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
если вам нужно решить просто проверить параметр имени
$extension = strtoupper(explode(".", $_FILES['spreadsheet']['name'])[1]);
Остальное работает спасибо 🙂