我正在使用非常有用的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);
}
}
任何建议都将非常感谢!谢谢。
答案 0 :(得分:-2)
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文件存储在存储路径中的某个位置并将路径硬编码到加载函数中。