PHPExcel - 查找第一个空单元格的列

3

尝试查找列中第一个空单元格。我的想法是选择我知道必须有值的列(在这种情况下,是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个回答

3
请勿使用

标签。
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接