Laravel Excel Динамический выбор строки заголовка

#laravel #laravel-excel

Вопрос:

В настоящее время я работаю над проектом Laravel, используя пакет Laravel-Excel.

Он работает нормально, за исключением случая использования, который я пытаюсь решить, я пытаюсь решить в течение нескольких часов.

Каждый CSV-файл, который я читаю, начинается со строк заголовка, и это особенно практично, но некоторые из моих CSV-файлов начинаются с аннотаций, таких как #CSV DD V2.4.3 в строке 1, за которыми следуют строки заголовка в строке 2.

Итак, мне нужно выяснить, как определить реальную строку, в которой расположены строки заголовка, чтобы избежать этой нежелательной строки. Мне особенно нужно, чтобы это работало в методе headingRow (), реализованном интерфейсом WithHeadingRow. есть ли способ захватить строки из csv-файла, чтобы определить правильную строку заголовка строки ?

Надеюсь , вы узнаете, заранее спасибо

Ответ №1:

Я бы рассмотрел возможность сделать это в два этапа. Это очень общий пример, поэтому вам нужно будет добавить соответствующую функцию импорта Laravel Excel и другие зависимости, выполнить любые проверки, чтобы убедиться, что файл существует, и так далее.

  1. Проверьте первую строку файла перед началом импорта, чтобы определить правильную строку заголовка.
 // get the first line of the file
$line = fgets(fopen('path/to/file.csv', 'r'));

// set the heading row based on the line contents
// add terms to search array if desired ['#CSV','...']
$heading_row = Str::startsWith(trim($line), ['#CSV']) ? 2 : 1;
 
  1. Динамически вводите значение строки заголовка, используя WithHeadingRow проблему и связанный с ней метод.
 class SampleImport implements WithHeadingRow
{
    private $heading_row;

    // inject the desired heading row or default to first row
    public function __construct($heading_row = 1)
    {
        $this->heading_row = $heading_row;
    }

    // set the heading row
    public function headingRow(): int
    {
        return $this->heading_row;
    }    
}
 

Теперь вы можете передать пользовательскую строку заголовка при запуске импорта.

 Excel::import(new SampleImport($heading_row), 'path/to/file.csv');
 

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

1. Спасибо за ваш ответ, это тоже была моя первая идея, но я надеялся , что Laravel Excel сможет дать метод, поведение, интерфейс для управления текущим файлом в любом месте, где вам это нужно

2. Вы можете попытаться расширить Laravel Excel, используя WithEvents проблему. Но, основываясь на моих тестах, headingRow() метод запускается до всех событий, кроме BeforeImport . Это означает, что у вас нет доступа к значениям листа до тех пор, пока не будет задана строка заголовка, что делает маловероятным, что эта опция предоставит элегантное решение.