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


PHPExcel - Finding First Column With blank cell

尝试定位列中的第一个空白单元格。我们的想法是选择一个我知道必须有值的列(在本例中是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 !

不要使用

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

一个单元格值总是存在,即使它是一个空字符串或null:你不是在测试实际的单元格值,而是一个单元格的存在....get()如果一个单元格对象不存在,将创建一个新的空单元格对象

您需要测试存储在单元格

中的实际值
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;