PHP – диапазон PHPExcel для массива игнорирует пустой столбец

У меня есть лист Excel, где я хочу получить диапазон A1:D4 в массив PHP.

введите здесь описание изображения

Для этого я использую PHPExcel, как показано ниже. У меня есть простой класс Excel:

Excel.php

public function __construct($file)
{
     if ($file instanceof \SplFileInfo) {
         $filename = $file->getRealPath();
     } else {
         $filename = $file;
     }

     $this->objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename);
     $this->objPHPExcel->setActiveSheetIndex(0);
}

Затем у меня есть простая функция для получения диапазона с помощью rangeToArray()< /а> функция:

public function getRange($range)
{
    $spreadsheet = $this->objPHPExcel;
    return $spreadsheet->rangeToArray($range,'  ', true, true, true);

}

$excel = new ExcelManipulator(storage_path() . '/app/temp_files/myfile.xlsx');
$array = $excel->getRange($range);

return response()->json(['result' => $array], 200);

Теперь проблема в том, что вышеуказанная функция «переключает» столбцы. См. вывод ниже:

[
  '1': [
     "A": "  ", 
     "B": "  ",
     "C": "  ",
     "D": "  "
  ],
  '2': [
     "A": "Company", 
     "B": "Acme Inc",
     "C": "  ",
     "D": "  "
  ],
  '3': [
     "A": "Address", 
     "B": "New York",
     "C": "  ",
     "D": "  "
  ],
  '4': [
     "A": "  ", 
     "B": "  ",
     "C": "  ",
     "D": "  "
  ]
]

Как вы можете видеть в массиве для строк 2 и 3, текст компания и адрес уже начинаются с Column A, тогда как они должны начинаться с Column B


person oliverbj    schedule 17.12.2019    source источник
comment
Привет @oliverbj, просто проверяю, используешь ли ты пакет phpoffice/phpspreadsheet, а не устаревший phpoffice/phpexcel верно?   -  person D Malan    schedule 20.12.2019
comment
@DelenaMalan Да, я использую пакет phpspreadsheet: \PhpOffice\PhpSpreadsheet   -  person oliverbj    schedule 20.12.2019
comment
Спасибо за уточнение. Какую версию ты используешь? Кроме того, вы присваиваете $this->objPHPExcel->setActiveSheetIndex(0) чему-либо? Потому что сейчас похоже, что вы вызываете rangeToArray в электронной таблице, а не в рабочем листе.   -  person D Malan    schedule 20.12.2019
comment
что вы определили $range?   -  person Hafez Divandari    schedule 22.12.2019
comment
Проблема, вероятно, связана с переменной $range. Не могли бы вы опубликовать немного больше контекста?   -  person iizno    schedule 23.12.2019
comment
Отправьте результат var_dump($spreadsheet->rangeToArray('A1:D4',' ', true, true, true)), var_dump((array)$spreadsheet->rangeToArray('A1:D4',' ', true, true, true)) и var_dump($spreadsheet->rangeToArray('A1:D4',' ', true, true, false))   -  person mvorisek    schedule 24.12.2019


Ответы (2)


Можешь попробовать

function getRange($range, $inputFileName)
{
    $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFilename);
    return $spreadsheet->getActiveSheet()->rangeToArray($range," ", true, true, true);

}
$inputFilename = storage_path() . '/app/temp_files/myfile.xlsx';
$array = getRange($range, $inputFilename);
person Fabrice Fabiyi    schedule 19.12.2019

Это отлично сработало для меня, используя php 7.2.26 и phpoffice/phpspreadsheet 1.10.1. Я создал файл xlsx с теми же значениями ячеек, что и у вас.

$excel = new Excel('file.xlsx');
$range = 'A1:D4';
$array = $excel->getRange($range);

var_dump($array);

class Excel
{
  private $objPHPExcel;

  public function __construct($file)
  {
     if ($file instanceof \SplFileInfo) {
         $filename = $file->getRealPath();
     } else {
         $filename = $file;
     }

     $this->objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename);
     $this->objPHPExcel->setActiveSheetIndex(0);
  }

  public function getRange($range)
  {
    $spreadsheet = $this->objPHPExcel->getActiveSheet();
    return $spreadsheet->rangeToArray($range,'  ', true, true, true);
  }
}

И это вывод:

array(4) {
  [1] =>
  array(4) {
    'A' =>
    string(2) "  "
    'B' =>
    string(2) "  "
    'C' =>
    string(2) "  "
    'D' =>
    string(2) "  "
  }
  [2] =>
  array(4) {
    'A' =>
    string(2) "  "
    'B' =>
    string(7) "Company"
    'C' =>
    string(8) "Acme Inc"
    'D' =>
    string(2) "  "
  }
  [3] =>
  array(4) {
    'A' =>
    string(2) "  "
    'B' =>
    string(7) "Address"
    'C' =>
    string(8) "New York"
    'D' =>
    string(2) "  "
  }
  [4] =>
  array(4) {
    'A' =>
    string(2) "  "
    'B' =>
    string(2) "  "
    'C' =>
    string(2) "  "
    'D' =>
    string(2) "  "
  }
}
person diegowc    schedule 24.12.2019