【发布时间】:2011-04-07 08:07:36
【问题描述】:
如何进行基于 Excel 工作表列的循环?我找到(并使用了)WorksheetIterator、RowIterator 和 CellIterator,但没有关于列。
【问题讨论】:
如何进行基于 Excel 工作表列的循环?我找到(并使用了)WorksheetIterator、RowIterator 和 CellIterator,但没有关于列。
【问题讨论】:
没有 ColumnIterator,因此您必须手动完成。
对于任何给定的工作表:
为一列循环行:
$column = 'A';
$lastRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $lastRow; $row++) {
$cell = $worksheet->getCell($column.$row);
// Do what you want with the cell
}
要在一行中循环列,您可以利用 PHP 的 Perls 样式来增加字符的能力:
$row = 1;
$lastColumn = $worksheet->getHighestColumn();
$lastColumn++;
for ($column = 'A'; $column != $lastColumn; $column++) {
$cell = $worksheet->getCell($column.$row);
// Do what you want with the cell
}
请注意,在比较列字母以测试循环中的最后一列时,我们不能简单地使用 "AZ",所以我们使用 != 比较,增加了最高列的值,以提供超过终点的第一列 ID。
你也可以使用
$worksheet->cellExists($column.$row);
在循环中测试单元格是否存在,然后使用 getCell()(或不使用)来模拟迭代器的 getIterateOnlyExistingCells() 行为
迭代器实际上相当慢,因此您可能会发现这些简单的循环比使用迭代器要快。
更新(2015-05-06)
PHPExcel 1.8.1 版引入了一个新的列迭代器。 Row 和 Column 迭代器还允许您指定要迭代的行或列范围,并允许您在循环时使用 prev() 和 next()
【讨论】:
B 是最后填充的列,那么您希望getHighestColumn() 返回什么?这就是它应该做的事情
这个简短的 sn-p 提供了对多行列的循环。 它获取最后一个非空列(及其行)的索引并循环到该索引,因此请注意 excel 中忘记的值。
代码循环遍历 A 列的行,然后是 B 列的行 ...
$objReader = new PHPExcel_Reader_Excel2007();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($file);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
{
$worksheetTitle = $worksheet->getTitle();
$highestColumn = $worksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
// expects same number of row records for all columns
$highestRow = $worksheet->getHighestRow();
for($col = 0; $col < $highestColumnIndex; $col++)
{
// if you do not expect same number of row records for all columns
// get highest row index for each column
// $highestRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $highestRow; $row++)
{
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();
// do what you want with cell value
}
}
}
【讨论】:
将列循环为范围
foreach ( range('A', $Excel->getActiveSheet()->getHighestColumn()) as $column_key) {
}
【讨论】:
range
试试这个!工作!
$limit = 10000;
$value='sua mensagem'
for($i=0,$j='A';$i<$limit;$i++,$j++) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue($j.$i, $value);
}
在 $value 中设置你想要打印的内容。
【讨论】:
->setCellValue($j.'1', $value); 和 $value 您可以制作另一个循环或放入数据库和/或数据文件中的数据以填充值。
这是对最后一条消息的 getColumnLetter 方法的修复,它允许您获取列的“字母”,无论您拥有多少列
function getColumnLetter( $number ){
$prefix = '';
$suffix = '';
$prefNum = intval( $number/26 );
if( $number > 25 ){
$prefix = getColumnLetter( $prefNum - 1 );
}
$suffix = chr( fmod( $number, 26 )+65 );
return $prefix.$suffix;
}
【讨论】:
这种递归方法的设计允许您获取列的“字母”,无论您拥有多少列,从“A”到“ZZZZZZZZZ...”:
function getColumnLetter( $number )
{
$prefix = '';
$suffix = '';
$prefNum = intval( $number/26 );
if( $prefNum > 25 )
{
$prefix = getColumnLetter( $prefNum );
}
$suffix = chr( fmod( $number, 26 )+65 );
return $prefix.$suffix;
}
因此,您可以在索引号上循环 PHP 数组的列并将其转换为字母字符串并在 PHPExcel 方法中使用它,例如“setCellValue”... 但是如果您可以使用上述解决方案,它们肯定会更快!
【讨论】:
在 PhpSpreadsheet(取代 PHPExcel)中,您可以这样做:
foreach( $sheet->getColumnIterator() as $col )
{
$sheet->getColumnDimension( $col->getColumnIndex() )->setAutosize( true );
}
【讨论】: