php - 使用 Laravel-Excel 选择工作表

标签 php laravel laravel-excel maatwebsite-excel

我正在使用非常有用的 https://github.com/Maatwebsite/Laravel-Excel 包。

因为我喜欢让我的 Controller 远离 excel 导入代码的想法,所以我正在使用 ExcelFile 注入(inject)加载上传的文件,请参见此处:http://www.maatwebsite.nl/laravel-excel/docs/import#injection

这是我的 ExcelFile 注入(inject)代码:

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 注入(inject)获取文件后在我的 Controller 中执行以下操作。

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() 方法中——这似乎是过滤器所在的地方和设置都已设置,所以我想这是您可以添加特定工作表选择的地方?

此外,我想知道如何将某些列设置为字符串,因为它们当前被读取为数字。目前我将文本输出为 float (即它们有一个小数点!),当我 dd() 第一行也是唯一一行而不使用 Value Binder 时,我得到以下信息:

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);
    }
}

任何建议将不胜感激!谢谢。

最佳答案

getFile 方法应该返回一个文件名:

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

存储路径仅指向您的存储文件夹,然后指向您传递给存储路径的任何子目录。

实际上,StudentImport->getFile() 至少在文档中只返回 '/path/to/MyProject/storage/excel/file.xls;。

虽然您可以进一步分离和扩展控制,但让我们从一个基本案例开始。

在你的 Controller 中:

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

关于php - 使用 Laravel-Excel 选择工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31564458/

相关文章:

c# - 是否可以更改使用我自己的浏览器呈现网站的方式?

php - laravel excel导出添加额外的标题行

php - 将自定义列添加到 laravel excel

php - 在回调之外获取 Laravel Excel block 结果

php - 在 Windows 上执行 Git 钩子(Hook)

php - 如果行不存在则加载数据INFILE

php - 每个 ID 仅选择一个条目

javascript - 如何使用 Blade 在 Laravel 中显示选择框所选选项的详细信息?

laravel - 如何重定向到带有 header 的外部 URL?

ios - 从 Laravel 发送 Firebase 推送通知