使用 PhpSpreadsheet 导入 Excel 中的信息、导出数据库中的信息到 Excel

Excel 是一个出色的数据管理工具,如果能把 Excel 的全部潜能发挥出来,其功能不亚于一个完成的程序语言。可是大多数人对 Excel 的使用仅限于做表格,填写数据,会使用 SUM 函数进行自动求和的已经是高手了。
如果能把 CMS 系统中的数据导出到 Excel,或者把 Excel 中的数据导入到 CMS 系统中,我们就可以把 CMS 系统和 Excel 软件对接起来,进行更加方便的数据管理。今天,我为大家介绍一下怎么使用 maatwebsite/excel 工具在 Laravel 开发的 CMS 系统中实现数据导入导出的功能。在 WordPress 中的实现也是类似的,把下面代码稍做调整即可。
首先,安装 maatwebsite/excel 库
直接运行下面的代码,Composer 会帮助安装 maatwebsite/excel 到我们的主题或插件中。

composer require maatwebsite/excel

实现信息导入功能
一些数据,可能是原本就存在与 Excel 工作表中的,如果再一条一条的输入到 CMS 系统中,工作量会比较大,而且是一个产生不了多少劳动产出的工作,既然程我们可以通过程序导入这些数据,为什么不呢?
导入的实现不困难,基本流程是读取 Excel 的数据,然后逐条写入到数据库即可。逐条写入数据库不是一个高效的处理方法,我们可以优化下面的代码,把数据批量写入的数据库,以提高性能。

try {
   $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load( $info_student );

   // $cells 是包含 Excel 表格数据的数组
   foreach ( $spreadsheet->getWorksheetIterator() as $cell ) {
      $cells = $cell->toArray();
   }

   // 去掉表头
   unset( $cells[ 0 ] );

   foreach ( $cells as $cell ) {

      $reg_no   = $cell[ 2 ];
      $password = str_random( 8 );
      // 添加或更新数据
      $student = StudentRegister::query()->firstOrCreate( [
         'form_id'   => $id,
         'school_id' => $logged_user->school_id,
         'reg_no'    => $reg_no,
      ] );

      // 添加对应的数据到报名信息
      $student->name      = $cell[ 0 ];
      $student->gender    = $cell[ 1 ];
      $student->ex_school = $cell[ 3 ];
      $student->save();
   }

} catch ( \Exception $e ) {

   return Redirect::back()->withErrors( '导入学生信息失败。' );
}

实现信息导出功能
导出功能的实现也很简单,首先获取需要导出的数据,然后循环把这些数据放入的工作表中,最后写入数据到文件中,提供给用户下载就可以了。
在这里又一个性能上的可用性问题,如果数据量非常大,实现的时候需要注意测试是否会因为执行时间过长导致导出失败。如果会,可能需要分批次导出,Laravel 中有非常简单的方法可以实现,相信熟悉 Laravel 的朋友都知道,在这里就不展开说了。

$students = StudentRegister::query()
                           ->where( 'school_id', $logged_user->school_id )
                           ->where( 'form_id', $id )
                           ->get();

try {

   $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();

   $worksheet = $spreadsheet->getActiveSheet();

   $worksheet->getCell( 'A1' )->setValue( '姓名' );
   $worksheet->getCell( 'B1' )->setValue( '学号' );
   $worksheet->getCell( 'C1' )->setValue( '验证码' );

   $i = 2;
   foreach ( $students as $student ) {
      $worksheet->getCell( 'A' . $i )->setValue( $student->name );
      $worksheet->getCell( 'B' . $i )->setValue( $student->reg_no );
      $worksheet->getCell( 'C' . $i )->setValue( $student->password );

      $i ++;
   }

   $filename="validate-code-" . date( 'YmdHis' ) . ".xlsx";
   $writer   = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter( $spreadsheet, "Xlsx" );

   header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' );
   header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
   $writer->save( "php://output" );

   return redirect( '/admin/student_register/' . $id . '/edit' )
      ->with( 'success', [ '导出成功' ] );

} catch ( \Exception $e ) {
   return redirect( '/admin/student_register/' . $id . '/edit' )
      ->with( 'success', $e->getMessage() );
}

自动计算列数
因为上面的数据比较少,我们可以直接把列数 “A1,B1” 硬编码到代码中,如果有几十列数据呢?像上面那样硬编码不但效率低、还容易出错,我们使用一个简单的函数自动获取数据列名称会方便很多。下面的函数可以获取指定数量的数据列名称为一个数组,我们根据列数访问数组的值即可获得数据列名称。

excel_header( $num = 0 )
{
   $arr = range( 'A', 'Z' );

   $no = ceil( $num / count( $arr ) );

   $data = [];

   if ( $no <= 1 ) {
      for ( $i = 0; $i < $num; $i ++ ) {
         $data[] = $arr[ $i ];
      }
   } else {
      for ( $i = 0; $i < count( $arr ); $i ++ ) {
         $data[] = $arr[ $i ];
      }
      for ( $i = 0; $i < $num - count( $arr ); $i ++ ) {
         $list   = ( ( $i + count( $arr ) ) % count( $arr ) );
         $data[] = $arr[ ceil( ( $i + 1 ) / count( $arr ) ) - 1 ] . $arr[ $list ];
      }
   }

   return $data;
}

虽然上面的代码是从 Laravel 框架开发的系统中摘出来的,但是除了获取数据和响应请求的部分,其他的代码都与 Laravel 没有直接的关系,只需要把代码中相应的部分更换为 WordPress 的函数就可以在 WordPress 中使用了。

声明:本站资源绿色无后门无广告,可放心下载。如无特殊说明或标注,均为本站原创发布,转载请注明出处!