首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Laravel-Excel选择工作表

使用Laravel-Excel选择工作表
EN

Stack Overflow用户
提问于 2015-07-22 13:23:13
回答 1查看 9.5K关注 0票数 4

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

由于我喜欢让我的控制器远离excel导入代码的想法,我使用ExcelFile注入加载上传的文件,参见此处:http://www.maatwebsite.nl/laravel-excel/docs/import#injection

这是我的ExcelFile注入代码:

StudentImport.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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()方法中--这似乎是设置过滤器和设置的地方,所以我想这就是您可能添加到特定工作表的选择的地方?

此外,我还想知道如何将某些列设置为字符串,因为它们当前被读取为数字。当前,文本以浮点数的形式输出(即,它们有以下小数点!),当不使用值Binder的第一行( dd() )时,将得到以下内容:

代码语言:javascript
复制
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
  ]
}

我尝试过像docs:http://www.maatwebsite.nl/laravel-excel/docs/import#formatting中提到的那样实现一个http://www.maatwebsite.nl/laravel-excel/docs/import#formatting,但是还没有成功。我只有一列需要作为日期读取,其余的应该作为文本读取,下面的代码不起作用:

代码语言:javascript
复制
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);
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2016-01-18 21:57:47

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

代码语言:javascript
复制
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;。

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

在您的控制器中:

代码语言:javascript
复制
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文件开始,并将路径硬编码到load函数中。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31564458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档