我正在使用非常有用的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);
}
}
任何建议将不胜感激!谢谢你。