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