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