2014-07-24 40 views
3

我試圖找到列中的第一個空白單元格。我的想法是選擇一個我知道必須具有值的列(在本例中爲JOB_NUMBER),並掃描它直到找到空白單元格。在我看來,我的代碼應該這樣做。但是,它永遠不會停止。我想它被困在while循環中,但我不明白爲什麼。PHPExcel - 使用空白單元格查找第一列

代碼:

<?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是一個好主意。

行也一路走到10000左右的地方。所以,我想找到第一個空白行並停在那裏。

TIA!

回答

3

不要使用

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

單元格值始終存在,即使它是一個空字符串或空:和你不測試實際單元格的值,但細胞的存在.. ..只是的get()婷細胞會創建一個新的空單元格對象,如果一個不存在

您需要測試存儲在單元格中的實際值

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

如果你正在試圖找到該列中第一空白單元格,然後break一旦你找到它,而不是直到你到達最高

(注進行迭代,不檢查富含細胞文本)

EDIT

實施例中,還允許合併單元

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;