欢迎光临 WordPress 智库!

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

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

使用 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 中使用了。

本站提供 WordPress 主题定制开发服务

本站长期承接 WordPress 主题、插件、基于 WooCommerce 的商店商城开发业务。 我们有 8 年 WordPress 开发经验,如果你想 用 WordPress 开发网站, 请联系 QQ: 470266798,或邮箱: 4626395@gmail.com 咨询。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*