PhpSpreadsheet block 过滤器读取返回空行

标签 php excel laravel-5 xlsx phpspreadsheet

我正在尝试按 block 读取 XLSX 文件。但是 var_dump 输出中的一些 block 是空的。 我正在使用 PHP7.2 和 Laravel 5.5 框架。

这就是我到目前为止所尝试的:

过滤器

class ChunkReadFilter implements IReadFilter
{
private $startRow = 0;
private $endRow   = 0;

// Set the list of rows that we want to read  
public function setRows($startRow, $chunkSize) {
    $this->startRow = $startRow;
    $this->endRow   = $startRow + $chunkSize;
}

public function readCell($column, $row, $worksheetName = '') {
    //  Only read the heading row, and the configured rows
  // if (($row == 1) || ($row >= $this->startRow && $row < $this->endRow)) {
 if (($row >= $this->startRow && $row < $this->endRow)) {
        if (in_array($column, range('A', 'L'))) {
            return true;
        }

    }
    return false;
}
}

代码

$inputFileType = 'Xlsx';
$inputFileName = $path;

$reader = IOFactory::createReader($inputFileType);
$chunkSize = 100;
$chunkFilter = new ChunkReadFilter();
for ($startRow = 1; $startRow <= 800; $startRow += $chunkSize) {

     //Tell the Read Filter which rows we want this iteration  
    $chunkFilter->setRows($startRow,$chunkSize);
    //Tell the Reader that we want to use the Read Filter 
    $reader->setReadFilter($chunkFilter);
    //Load only the rows that match our filter  
    $spreadsheet = $reader->load($inputFileName);
    //Do some processing here
    $sheetData = $spreadsheet->getActiveSheet()
   ->toArray(null, true, true, true);

      var_dump($sheetData);
   }

最佳答案

PHPSpreadsheet 查克阅读器仅返回当前页面值并返回 NULL,

请检查以下代码是否可以解决您的问题。

$startRow       = 1;
$arrStrHeadings = [];
$chunkFilter    = new ChunkReadFilter();
$objCsvReader   = new \PhpOffice\PhpSpreadsheet\Reader\Csv();

$objCsvReader->setReadDataOnly(true);
$objCsvReader->setReadFilter($chunkFilter);

while (true) {

    $chunkFilter->setRows($startRow, self::CHUNK_LIMIT);

    $objWorksheet = $objCsvReader->load($arrMixSource['file'])->getActiveSheet();

    $pRange = 'A' . $startRow . ':' . $objWorksheet->getHighestColumn() . $objWorksheet->getHighestRow();

    $arrStrSheetData = $objWorksheet->rangeToArray( $pRange, $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false);

    if (0 == count($arrStrSheetData)) {
        break;
    }

    if( 1 == $startRow && empty($arrStrHeadings)) {
        $arrStrHeadings = array_map('strtolower', array_shift($arrStrSheetData));
    }

    foreach ($arrStrSheetData as $arrStrSheetDatum) {

        $arrStrSheetDatum = array_combine($arrStrHeadings, $arrStrSheetDatum);

        // Do oprations...
    }

    $startRow += self::CHUNK_LIMIT;
}

关于PhpSpreadsheet block 过滤器读取返回空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091437/

相关文章:

php - 有限制地排队 Guzzle 请求

php - 识别html示例中的所有类值

php - MySQL PHP count(*) 返回一些奇怪的东西

c# - 使用 OleDB 打开 Excel(用 EPPLUS 创建)

vba - 使用vba在excel单元格中拆分文本和数字

excel - 代码给了我编译错误,预期为 : List Separator or )

php - Laravel 5 : How to use findOrFail() method?

php - 从外部设备本地访问 Laravel 5 应用程序

php - 按原样写\r\n

php - 谷歌云存储 : Upload Object is returning HTTP/1. 1 100 继续