PHPExcel - 使用空白单元格查找第一列

时间:2014-07-24 14:44:39

标签: php phpexcel

我试图在列中找到第一个空白单元格。我的想法是选择一个我知道必须有一个值的列(在这种情况下,JOB_NUMBER)并扫描它直到找到一个空白单元格。在我看来,我的代码应该这样做。然而,它永远不会停止。我想它会卡在while循环中,但我不明白为什么。

代码:

<?php 
require('./Classes/PHPExcel/IOFactory.php');

ini_set('max_execution_time', 800);
ini_set('memory_limit', 2000000000);  

$inputFileType = 'Excel2007';
$inputFileName = $_FILES['file']['tmp_name'];

class MyReadFilter implements PHPExcel_Reader_IReadFilter {

    public function __construct($fromColumn, $toColumn) {
        $this->columns = array();
        $toColumn++;
        while ($fromColumn !== $toColumn) {
        $this->columns[] = $fromColumn++;
        }
    }

    public function readCell($column, $row, $worksheetName = '') {
          // Read columns from 'A' to 'AF'
          if (in_array($column, $this->columns)) {
              return true;
          }
          return false;
      }
}

$filterSubset = new MyReadFilter('A', 'AF'); 

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$objReader->setReadFilter($filterSubset); 
$objReader->setLoadSheetsOnly( array("NORTH") );
$objPHPExcelReader = $objReader->load($inputFileName);

$r = 3500;
while(isset($maxrow_north) != 1){
    $cellvalue = $objPHPExcelReader->getSheetByName('NORTH')->getCellByColumnAndRow(2, $r);

    if(isset($cellvalue) != 1){
        $maxrow_north = $r; 
    } elseif($r > 4000) {
        echo "It's over 4000!";
    } else {
        $r = $r++;
        } 
}


echo $maxrow_north;
?>

更多背景

我让管理员将.xlsx .xls.csv个文件上传到html表单中。上面的代码是处理程序。我限制了所看到的列数,因为.xlsx文件的原始创建者认为让列一直到XCF是个好主意。

这些行也会一直延伸到10,000左右。所以,我想找到第一个空白行并停在那里。

TIA!

1 个答案:

答案 0 :(得分:3)

不要使用

if(isset($cellvalue) != 1){

单元格值总是存在,即使它是一个空字符串或null:并且你没有测试实际的单元格值,而是一个单元格的存在....只需得到()如果一个单元格尚未存在,则单元格将创建一个新的空单元格对象

您需要测试存储在单元格中的实际值

if($cellvalue->getValue() === NULL || $cellvalue->getValue() === '') {
    $maxrow_north = $r;

如果您正在尝试在列中找到第一个空白单元格,那么break一旦找到它就会发现它而不是继续迭代直到达到你的最大

(注意,不检查单元格中的富文本)

修改

示例,也允许合并的单元格

function testInMergeRangeNotParent($objWorksheet, $cell)
{
    $inMergeRange = false;
    foreach($objWorksheet->getMergeCells() as $mergeRange) {
        if ($cell->isInRange($mergeRange)) {
            $range = PHPExcel_Cell::splitRange($mergeRange);
            list($startCell) = $range[0];
            if ($cell->getCoordinate() !== $startCell) {
                $inMergeRange = true;
            }
            break;
        }
    }
    return $inMergeRange;
}


$column = 2;  // Column to check
$max = 4000;
echo 'Get First blank row in column ', $column, PHP_EOL;
$r = 3500;  // Starting row
while(true){
    $cell = $objPHPExcelReader->getSheetByName('NORTH')->getCellByColumnAndRow($column, $r);
    if ($cell->getValue() === NULL && 
        !testInMergeRangeNotParent($objPHPExcelReader->getSheetByName('NORTH'), $cell)) {
        break;
    }elseif($r > $max) {
        echo "It's over $max !";
        break;
    }
    $r++;
}
echo 'First blank row in column ', $column, ' is ', $r, PHP_EOL;