PHPExcel 需要很长时间才能读取 Excel 文件

Jef*_*eff 3 php phpexcel

我使用的是 PHPExcel 1.7.8、PHP 5.4.14、Windows 7 和 Excel 2007 电子表格。该电子表格由 750 行、A 列到 BW 列组成,大小约为 600KB。这是我打开电子表格的代码——非常标准:

//Include PHPExcel_IOFactory
include 'PHPExcel/IOFactory.php';
include 'PHPExcel.php';

$inputFileName = 'C:\xls\lspimport\GetLSP1.xlsx';

//  Read your Excel workbook
try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objReader->setReadDataOnly(true);
    $objPHPExcel = $objReader->load($inputFileName);
} catch(Exception $e) {
    die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}

//set active worksheet
$objWorksheet = $objPHPExcel->setActiveSheetIndexbyName('Sheet1');

$j = 0;

for($i = 2; $i < 3; $i++)
{
...
}
Run Code Online (Sandbox Code Playgroud)

最后,我最终希望遍历电子表格中的每一行,但目前在我完善脚本的同时,我只遍历了一行。问题是,执行此脚本需要 30 分钟。我echo会在每段代码之后发送消息,以便我可以看到正在处理的内容和时间,并且我的脚本在这部分基本上等待了 30 分钟:

$objPHPExcel = $objReader->load($inputFileName);
Run Code Online (Sandbox Code Playgroud)

有一个配置不正确的东西?我不明白为什么加载电子表格需要 30 分钟。我感谢任何和所有的帮助。

km6*_*zla 5

PHPExcel 在识别 excel 文件的结尾位置时遇到问题。或者更确切地说,Excel 很难知道自己的终点在哪里。如果您触摸 A:1000000 处的单元格,它认为它需要读取那么远。

我过去做了两件事来解决这个问题:

1) 将您需要的数据剪切并粘贴到新的 excel 文件中。2) 指定您要阅读的确切尺寸。

编辑如何做选项 2

public function readExcelDataToArray($excelFilePath, $maxRowNumber=-1, $maxColumnNumber=-1)
{
    $objPHPExcel = PHPExcel_IOFactory::load($excelFilePath);
    $objWorksheet = $objPHPExcel->getActiveSheet();

    //Get last row and column that have data
    if ($maxRowNumber == -1){
    $lastRow = $objWorksheet->getHighestDataRow();
    } else {
        $lastRow = $maxRowNumber;
    }

    if ($maxColumnNumber == -1){
        $lastCol = $objWorksheet->getHighestDataColumn();
        //Change Column letter to column number
        $lastCol = PHPExcel_Cell::columnIndexFromString($lastCol);      
    } else {
        $lastCol = $maxColumnNumber;
    }   

    //Get Data Array
    $dataArray = array();

    for ($currentRow = 1; $currentRow <= $lastRow; $currentRow++){
        for ($currentCol = 0; $currentCol <= $lastCol; $currentCol++){
            $dataArray[$currentRow][$currentCol] = $objWorksheet->getCellByColumnAndRow($currentCol,, $currentRow)->getValue();
        }
    }
    return $dataArray;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些解决方案不是很动态。

请注意,现代 excel 文件实际上只是带有 xlsx 扩展名的 zip。我已经为 PHPExcel 编写了解压缩它们的扩展,并修改了某些 xml 文件以获得我想要的行为类型。

给您的第三个建议是监视每一行的内容,并在有空行时停止。

  • 实际上,你错了......如果一个单元格存在,那么PHPExcel会读取它,如果一个单元格不存在那么PHPExcel就没有什么可以读取的了。如果您触摸单元格 A1 和 A10000,那仍然只有 2 个单元格可供读取,因此不会使读取速度变慢。 (2认同)