我使用一个自定义读取过滤器读取文件块:
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行的文件中:
- 如果我读取从100到120行,我得到
120
- 如果我试图读取从300到320的行,我得到
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
循环遍历单元格的最佳方法是使用getRowIterator
和getCellIterator
:
$rows = $sheet->getRowIterator();
foreach ($rows as $r => $row) {
$cells = $row->getCellIterator();
foreach ($cells as $c => $cell) {
$value = $cell->getValue();
}
}