2

我正在尝试检查用户上传的 excel 文件是否具有正确的列/第一行/属性,然后再读入其他行。我将 Laravel 4 与MaatWebsite 的Laravel Excel 一起使用。

我创建了一个函数,允许用户通过导入 excel 文件来更新系统数据库的员工表。

现在正确的 excel 文件有 3 列:firstnamelastnameusername. 如果 excel 文件具有所有这些属性/列,我现在将读取以下每一行并验证每一行,到目前为止,这并不是我的问题的一部分。

但是,如果 excel 文件中不存在 3 个属性/列中的任何一个,我会忽略该请求并返回错误。

我尝试使用它,它获取lastname属性:

$sample = Excel::selectSheetsByIndex(0)->load($readFile, function($reader){})->get(array("lastname"));

但是即使lastname没有找到, $sample 仍然不为空,所以我无法检查是否lastname存在。

如何检查属性/列是否存在/不存在?

更新:

如果属性行之后的第一行具有所有需要的属性,我选择的答案将非常有效。例如:如果它具有firstnamelastname和的值username

但是,如果first name缺少第一个非属性行(引用列名的属性行)的值(或任何属性值),则提供的脚本将返回 false,即使 excel 文件具有所有firstname, lastname, 和username属性。

所以我将脚本修改为:

  1. 首先,我阅读了excel文件。我还声明了一个布尔变量来标记 excel 文件是否有效。

$excelChecker = Excel::selectSheetsByIndex(0)->load('path/to/file', function($reader){})->get()->toArray();

$excelIsValid = false;
  1. 然后我遍历所有结果并检查是否至少一次,所有需要的值(firstnamelastnameusername)都已设置或存在。

    foreach($excelChecker as $ex){
    
        if(isset($ex["lastname"]) && isset($ex["firstname"]) && isset($ex["username"])){
             $excelIsValid = true;
       }
    }
    

解释:

如果$excelIsValidfalse处于循环的末尾,则该文件一次都没有具有所需的所有属性。这意味着文件为空、属性名称错误或没有任何有效行。简而言之,该文件无效,不应在系统中。

4

2 回答 2

8

我准备了这个示例脚本:

Route::get('/', function() {

    $isError = false;

    Excel::load('file.xls', function($reader) use (&$isError) {

        $firstrow = $reader->first()->toArray();

        if (isset($firstrow['firstname']) && isset($firstrow['lastname']) && isset($firstrow['username'])) {
            $rows = $reader->all();
            foreach ($rows as $row) {
                echo $row->firstname.' '.$row->lastname.' '.$row->username."<br />";
            }
        }
        else {
            $isError = true;

        }

    });
    if ($isError) {
        return View::make('error');
    }
});

该脚本加载文件并检查是否有您想要的列。它不会检查是否有更多列 - 当然,如果你愿意,你可以添加 exta check - count($firstow) == 3。如果有错误,它会设置$isErrortrue在路由中显示一个模板。

于 2014-09-25T07:22:42.490 回答
1

在 Laravel Excel 3.1 中,您可以使用

        public function import()
        {
            $column= (new HeadingRowImport)->toArray('users.xlsx');

            if (isset($column['firstname']) && isset($column['lastname']) &&  isset($column['username'])) {
                 //dd('columns found');
                 //your code
            }else{
                //dd('columns not found');
                //if not found show error or something
            }

        }

如果其他,您可以在其中做任何事情,或者您可以使用您的逻辑

于 2021-04-20T20:20:12.007 回答