PhpSpreadsheet — получить необработанное строковое значение для дат d/m/Y вместо преобразования в числа с плавающей запятой

Я пытаюсь прочитать файл Excel с форматом 03/05/2008, но когда я читаю с помощью PhpSpreadsheet, он возвращает мне 2008.0.

Есть ли способ получить необработанный строковый формат столбцов вместо преобразования в число с плавающей запятой?

try {
    $inputFileType = IOFactory::identify($path);

    try {
        $reader = IOFactory::createReader($inputFileType);
        $reader->setReadDataOnly(true);
        $valuesSpreadsheet = $reader->load($path);

        try {
           $spreadsheetArr = $valuesSpreadsheet->getActiveSheet()->toArray();
           dd($spreadsheetArr);
        }
     }
}

Изменить: я не хочу получать конкретную ячейку и преобразовывать ее в отметку времени, как в комментариях ниже. Я хочу получить как массив ->toArray(), но получаю все форматы необработанных строк.


person senty    schedule 19.03.2019    source источник


Ответы (3)


Удалите строку $reader->setReadDataOnly(true) перед загрузкой данных, и значения должны отображаться правильно. Если нет, вы также можете попробовать следующий код.

$path = 'yourPath';

try {
    $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($path);

    try {
        $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);       
        $valuesSpreadsheet = $reader->load($path);

        try {
           $spreadsheetArr = $valuesSpreadsheet->getActiveSheet()->toArray(null, null, true, true);
           print '<pre>' . print_r($spreadsheetArr, 1) . '</pre>';
        } catch (Exception $e) {
            echo $e . PHP_EOL;
        }
     } catch (Exception $e) {
        echo 'Unable to load file ' . $path . PHP_EOL;
        echo $e . PHP_EOL;
     }
} catch (Exception $e) {
    echo 'Unable to locate file ' . $path . PHP_EOL;
    echo $e . PHP_EOL;
}
person Garrett Burke    schedule 22.03.2019

toArray() имеет параметр для возврата значений ячеек, отформатированных так, как они есть в электронной таблице. Попробуйте назвать это так:

$spreadsheetArr = $valuesSpreadsheet->getActiveSheet()->toArray(null, true, true, true);

Около 80% пути вниз эта страница является документацией по функции toArray().

Короче говоря, toArray() может принимать 4 параметра:

  1. любое значение, которое вы хотите вернуть пустым ячейкам
  2. (boolean) нужно ли вычислять формулы?
  3. (логическое значение) имеет ли значение форматирование ячейки?
  4. (логическое) вы хотите, чтобы массив индексировался столбцом и строкой электронной таблицы?
person drakin8564    schedule 13.06.2019

Вы должны использовать функции getRowIterator() и getCellIterator() для перебора всех ячеек. В приведенном ниже коде все ячейки будут возвращены как необработанные значения.

try {
    $inputFileType = IOFactory::identify($path);
    try {
        $reader = IOFactory::createReader($inputFileType);
        $reader->setReadDataOnly(true);
        $spreadsheet = $reader->load($path);
        $worksheet = $spreadsheet->getActiveSheet();\
        foreach ($worksheet->getRowIterator() as $index => $row) {
            $cellIterator = $row->getCellIterator();
            $cellIterator->setIterateOnlyExistingCells(FALSE); //This loops through all cells
            $cells = [];
            foreach ($cellIterator as $cell) {
                $cells[] = $cell->getValue();
            }
            $rows[] = $cells;
            print_r($rows);
        }
    }
}
person Zafahix    schedule 13.06.2019