我使用自定义读取过滤器来读取块中的文件:
class chunkReadFilter implements PHPExcel_Reader_IReadFilter{
private $start_row, $end_row, $chunk_size;
public function __construct($chunk_size, $start_row=1){
$this->chunk_size = $chunk_size;
$this->start_row = $start_row;
$this->end_row = $start_row+$chunk_size-1;
}
public function moveCursor(){
$this->start_row += $this->chunk_size;
$this->end_row += $this->chunk_size;
}
public function readCell($column, $row, $worksheetName = ''){
return $row>=$this->start_row && $row<=$this->end_row;
}
}
我的问题是,我不知道如何检测我已经完成了。示例和文档总是硬编码最大行:
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
}
PHPExcel_Worksheet::getHighestRow()
和PHPExcel_Worksheet::getHighestDataRow()
方法似乎适用于过滤后的数据(种类)。例如,在200行文件中:
120
1
: - ?停止循环的最佳方法是什么?
答案 0 :(得分:1)
停止循环的最佳方法是首先知道应该读取多少行。
每个Reader中都有一个帮助方法,它将提供有关该文件的一些基本元数据,而无需全部加载。
开始循环之前:
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$worksheetData = $objReader->listWorksheetInfo($inputFileName);
echo '<h3>Worksheet Information</h3>';
echo '<ol>';
foreach ($worksheetData as $worksheet) {
echo '<li>', $worksheet['worksheetName'], '<br />';
echo 'Rows: ', $worksheet['totalRows'],
' Columns: ', $worksheet['totalColumns'], '<br />';
echo 'Cell Range: A1:',
$worksheet['lastColumnLetter'], $worksheet['totalRows'];
echo '</li>';
}
echo '</ol>';
阅读电子表格文件的用户文档的第7部分以及Examples/Reader/exampleReader19.php
答案 1 :(得分:0)
循环遍历单元格的最佳方法是使用getRowIterator
和getCellIterator
:
$rows = $sheet->getRowIterator();
foreach ($rows as $r => $row) {
$cells = $row->getCellIterator();
foreach ($cells as $c => $cell) {
$value = $cell->getValue();
}
}