#laravel #laravel-excel
Вопрос:
В настоящее время я работаю над проектом Laravel, используя пакет Laravel-Excel.
Он работает нормально, за исключением случая использования, который я пытаюсь решить, я пытаюсь решить в течение нескольких часов.
Каждый CSV-файл, который я читаю, начинается со строк заголовка, и это особенно практично, но некоторые из моих CSV-файлов начинаются с аннотаций, таких как #CSV DD V2.4.3 в строке 1, за которыми следуют строки заголовка в строке 2.
Итак, мне нужно выяснить, как определить реальную строку, в которой расположены строки заголовка, чтобы избежать этой нежелательной строки. Мне особенно нужно, чтобы это работало в методе headingRow (), реализованном интерфейсом WithHeadingRow. есть ли способ захватить строки из csv-файла, чтобы определить правильную строку заголовка строки ?
Надеюсь , вы узнаете, заранее спасибо
Ответ №1:
Я бы рассмотрел возможность сделать это в два этапа. Это очень общий пример, поэтому вам нужно будет добавить соответствующую функцию импорта Laravel Excel и другие зависимости, выполнить любые проверки, чтобы убедиться, что файл существует, и так далее.
- Проверьте первую строку файла перед началом импорта, чтобы определить правильную строку заголовка.
// 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;
- Динамически вводите значение строки заголовка, используя
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
. Это означает, что у вас нет доступа к значениям листа до тех пор, пока не будет задана строка заголовка, что делает маловероятным, что эта опция предоставит элегантное решение.