Как вы читаете ячейки в PHPOffice PhpSpreadsheet с помощью IReadFilter в PHP?

#php #excel #spreadsheet #phpspreadsheet

#php #excel #электронная таблица #phpspreadsheet

Вопрос:

Я пытаюсь прочитать два столбца из электронной таблицы на нескольких листах. Примером этого может быть:

 Sheet One:        Sheet Two:        Sheet Three:        ETC...
A ..... V         A ..... V         A ..... V           <-- Two Columns I need
1       5         32      9         54      1           <-- Rows Below
2       8         33      2         55      3
3       9         34      7         56      8
  

Пока я загружаю электронную таблицу с помощью PhpOfficePHPSpreadsheet и документации, чтобы узнать, как это сделать.

После компиляции всей информации из документации вместе, я придумал это:

 class CustomXlsxReader implements PhpOfficePhpSpreadsheetReaderIReadFilter
{
    public function readCell($column, $row, $worksheetName = '') {
         return in_array($column, range('A','V'));
    }
}

$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setLoadSheetsOnly(["A Coy", "B Coy", "C Coy", "S Coy", "HQ Coy"]);
$reader->setReadDataOnly(true);
$reader->setReadFilter(new CustomXlsxReader());
$spreadsheet = $reader->load($_FILES['xlsxFile']['tmp_name']); // I do not want to physically save the file as the data will be converted to a database for further distribution
  

Я попытался найти раздел документации для чтения ячеек и нашел это:

 $worksheet = $spreadsheet->getActiveSheet(); // Not sure how to change between these

foreach ($worksheet->getRowIterator() as $row) {
    $cellIterator = $row->getCellIterator();
        foreach ($cellIterator as $cell) {
            $cell = $cell->getValue(); // Not sure what column this is looping through
        }
    }
  

Я вижу, что PhpOfficePhpSpreadsheetReaderIReadFilter у него есть метод для чтения строк, однако у $spreadsheet экземпляра нет этого метода, и я, хоть убей, не могу найти, как использовать это в документации.

Как я могу теперь читать столбцы A и V с каждого листа в моей электронной таблице? Я хочу перебирать листы (A, B и т. Д.) И Читать столбцы A и V для каждого. array_merge не будет конфликтовать с какими-либо данными, поэтому, если невозможно специально читать лист за листом, тогда объединенное решение также было бы отличным.

Заранее большое спасибо.

Ответ №1:

В электронной таблице нет этих методов, потому что доступ к ним осуществляется в программе чтения, а не в электронной таблице; ReadFilter просто сообщает читателю загружать только данные ячеек для столбцов A-V, когда он считывает файл в объект электронной таблицы

 $worksheet = $spreadsheet->getActiveSheet(); // Not sure how to change between these
// Use `setActiveSheetIndex(<worksheetindex>)`
//  or `setActiveSheetIndexByName(<worksheetname>)
//  to set the selected worksheet

foreach ($worksheet->getRowIterator() as $row) {
    $cellIterator = $row->getCellIterator();
        foreach ($cellIterator as $cell) {
            $cell = $cell->getValue(); // Not sure what column this is looping through
            // The $cell->getColumn() method will tell you the column
        }
    }
  

Комментарии:

1. Идеальный. Я использовал этот цикл для чтения данных, а затем использовал getCoordinate() метод, чтобы найти, какая ячейка была A или V , и читать только из них. Большое спасибо!