Все листы в электронной таблице являются ссылкой на лист 0 - PullRequest
0 голосов
/ 22 февраля 2020

Я пишу сценарий импорта цен, который читает из таблицы Excel.

Таблица генерируется с использованием Office 365 Excel, однако я использую LibreOffice Cal c в Ubuntu 18.04 для просмотра во время разработки - нет вопросы здесь.

Я использую phpoffice/phpspreadsheet в версии 1.10.1:

        "name": "phpoffice/phpspreadsheet",
        "version": "1.10.1",
        "source": {
            "type": "git",
            "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
            "reference": "1648dc9ebef6ebe0c5a172e16cf66732918416e0"
        },

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

Существует 3 рабочих листа, каждый из которых представляет «Зоны» - Зона 1, Зона 2 и Зона 3.

Я получаю те же данные для Зоны 2 и Зоны 3, что и для Зоны 1 - рабочий лист заголовок возвращается правильно, однако данные не меняются между листами.

   /**
     * @param Spreadsheet $spreadsheet
     *
     * @return array
     */
    private function parseZones(Spreadsheet $spreadsheet): array
    {
        $zones = [];

        foreach ([0, 1, 2] as $sheetIndex) {
            $sheet = $spreadsheet->getSheet($sheetIndex);
            // this is correctly reporting 'Zone 1', 'Zone 2' and 'Zone 3' - sheet title is accurate
            $sheetName = $sheet->getTitle();

            // sheet 0 is accurate
            $sheetData = $sheet->toArray();

            // on sheet index 1 and 2 - $sheetData is identical to that of sheet index 0
            // the XLSX file in OpenOffice / Excel has distinctly different row data - 50% less rows in both cases
            // feels like a memory cache issue / some mis-referencing?
        }

        // retrieving rows using this approach yields the same result:
        foreach ($spreadsheet->getAllSheets() as $sheet) {
            // this is correctly reporting 'Zone 1', 'Zone 2' and 'Zone 3' - sheet title is accurate
            $sheetName = $sheet->getTitle();
            // on sheet index 1 and 2 - $sheetData is identical to that of sheet index 0
            $sheetData = $sheet->toArray();
        }

        return $zones;
    }

Есть идеи? Спасибо

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Попробуйте просто изменить текущий активный лист перед чтением.

$spreadsheet->setActiveSheetIndex($sheetIndex);
$sheet = $spreadsheet->getActiveSheet();

$dataArray = $sheet
 ->rangeToArray(
     'A4:O07',    // The worksheet range that we want to retrieve
     NULL,        // Value that should be returned for empty cells
     TRUE,        // Should formulas be calculated (the equivalent of getCalculatedValue() for each cell)
     TRUE,        // Should values be formatted (the equivalent of getFormattedValue() for each cell)
     TRUE         // Should the array be indexed by cell row and cell column
 );

PhpSpreadsheet

0 голосов
/ 22 февраля 2020

Я наглый - полностью не смог увидеть / проверить фильтрацию строк в электронной таблице.

Он возвращает правильные данные.

Нет проблем, извините!

enter image description here

С тех пор я начал исследовать, как читать лист, подчиняясь фильтрам, встроенным в электронную таблицу, и кажется, что Worksheet::toArray() не принимает фильтры автоматически account - и не выполняет итерацию столбцов и строк вручную, см .:

https://phpspreadsheet.readthedocs.io/en/latest/topics/autofilters/

enter image description here

Вы должны вручную проверьте настройки видимости строки согласно документам.

Надеюсь, это поможет!

...