Выбор листа с помощью Laravel-Excel

Я пользуюсь очень полезным https://github.com/Maatwebsite/Laravel-Excel пакет.

Мне понравилась идея о том, чтобы мои контроллеры очищались от кода импорта Excel, я загружаю загруженный файл с помощью инъекций ExcelFile, см. Здесь: http://www.maatwebsite.nl/laravel-excel/docs/import#injection

Это мой код для инъекций ExcelFile:

StudentImport.php

namespace App\Excel;

class StudentImport extends \Maatwebsite\Excel\Files\ExcelFile {

public function getFile()
{
return \Input::file('student_file');
}

public function getFilters()
{
return [];
}

}

Однако моя проблема в том, что я не понимаю, где я запускаю такие методы, как: ->selectSheets('mysheet') при использовании этого подхода.

Моя текущая работа заключается в выполнении следующих действий в моем контроллере после использования инъекции ExcelFile для получения файла.

ExcelController.php

public function import(StudentImportFormRequest $request, StudentImport $import)
{
$results = $import->get();

foreach($results as $sheet) {
$sheetTitle = $sheet->getTitle();

if($sheetTitle === 'students') {
foreach($sheet as $row) {
// do something
}
}
}

}

Я полагаю, что мне может понадобиться расширить класс ExcelFile и добавить новый метод, который будет оберткой вокруг метода selectSheets () или каким-либо образом добавить его в метод loadFile () — кажется, это место, где фильтры и настройки настроить, так что я думаю, это где вы могли бы добавить в выбор конкретного листа?

Кроме того, я хотел бы знать, как установить определенные столбцы в строки, поскольку они в настоящее время читаются как числа. В настоящее время у меня есть текст, выводимый как числа с плавающей запятой (то есть они имеют следующую десятичную точку!), Когда я dd () первой и единственной строки без использования связывателя значений, я получаю следующее:

CellCollection {#862 ▼
#title: null
#items: array:8 [▼
"name" => "John Smith""refno" => "s123""nid" => 1234567890.0
"birth_date" => Carbon {#861 ▼
+"date": "1971-01-05 00:00:00.000000"+"timezone_type": 3
+"timezone": "UTC"}
"is_active" => 1.0
"course_title" => "Computer Science""institution_id" => 1.0
"course_id" => 1.0
]
}

Я попытался реализовать ValueBinder, как упомянуто в документации: http://www.maatwebsite.nl/laravel-excel/docs/import#formatting но пока не имели успеха. У меня есть только один столбец, который должен быть прочитан как дата, остальные должны быть прочитаны как текст, а следующий код не работает:

namespace App\Excel;

use PHPExcel_Cell;
use PHPExcel_Cell_DataType;
use PHPExcel_Cell_IValueBinder;
use PHPExcel_Cell_DefaultValueBinder;

class StudentValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
{
public function bindValue(PHPExcel_Cell $cell, $value = null)
{
if ($cell->getColumn() !== 'D') {

$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);

return true;
}

// else return default behavior
return parent::bindValue($cell, $value);
}
}

Любой совет будет наиболее ценным! Спасибо.

4

Решение

Метод getFile должен возвращать имя файла:

namespace App\Excel
class MyExcelClass {
public function getFile()
{
return storage_path('excel') . '/file.xls';
}
}

Путь к хранилищу просто указывает на вашу папку хранилища, а затем на любой подкаталог, который вы передаете в storage_path.

Поэтому действительно StudentImport-> getFile (), по крайней мере в документах, просто возвращает ‘/path/to/MyProject/storage/excel/file.xls ;.

Хотя вы можете отделить и расширить контроль дальше, давайте начнем с базового варианта.

В вашем контроллере:

use Maatwebsite\Excel\Facades\Excel;
use App\Excel\MyExcelClass;
class ExcelController extends Controller
{
public function importAndManipulate() {
Excel::load(MyExcelClass::getFile(), function ($reader){
$reader->first(); // get first sheet
foreach($reader as $sheet) // loop through sheets
{
$sheetTitle = $sheet->getTitle();
}
});
}
}

Вы также можете попробовать $ reader-> selectSheet (‘NameOfSheet’). Если это не сработает, попробуйте вызвать selectSheet на фасаде либо после загрузки листа, либо в рамках обратного вызова.

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

http://www.maatwebsite.nl/laravel-excel/docs/import

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]