【问题标题】:Reading spreadsheet using PHPExcel使用 PHPExcel 读取电子表格
【发布时间】:2014-02-02 06:48:52
【问题描述】:

我正在尝试上传电子表格并使用 PHPExcel 将其读入 MySQL 数据库。

对于 .xlsx 文件,它可以正常工作,但每当我尝试上传 .ods 文件时,它都会引发错误:PHP 致命错误:在 PHPExcel_1.7.9/Classes/PHPExcel 中的非对象上调用成员函数 getNamespaces() /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'];
    }
}
}

?>

【问题讨论】:

  • 将此行 `$inputFile = $_FILES['spreadsheet']['name'];` 更改为 `$inputFile = $_FILES['spreadsheet']['tmp_name'];`跨度>

标签: php phpexcel


【解决方案1】:

当一个文件上传到您的网络服务器时,该文件将被保存在您系统的临时文件夹中,名称是随机的。

您尝试做的是提供您上传的文件的实际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'];
}
}
}

?>

【讨论】:

  • 我已根据您的建议编辑了上面的代码(直接复制使其无法通过我的扩展检查)。现在我的错误日志中出现以下错误:PHP 致命错误:在 PHPExcel_1.7.9/Classes/PHPExcel/Reader/OOCalc.php 的第 341 行调用非对象上的成员函数 getNamespaces()
  • 让我下载phpexcel我试试看。但它可能是 phpexcel 中的错误尝试不同的文件
  • 您是否尝试了其他 xlsx 文件以查看它是否有效?在这里下载 phpExcel 类后,我得到了 try catch 错误“文件不存在”(所以我猜文件无法在我的 tmp 文件夹中访问。)
  • 尝试与以前完全相同的文件,但这次保存为 .xlsx 一切正常 - ODS 继续抛出相同的错误...
  • 嗯.. 如果我在这里使用 ods 格式,它也可以正常工作。这可能是您在 ods 格式中使用的某种公式,它会在 phpexcel 中产生错误。我很乐意在这方面为您提供更多帮助,但我想我无能为力:s
【解决方案2】:

在我的情况下,检测此行中的扩展名时出错

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

如果您需要解决,只需从名称参数中检查

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

其余的工作都在感谢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多