#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
, и читать только из них. Большое спасибо!