作者:白狼 出处:http://www.manks.top/article/yii2_excel_extension 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
先概括下我们接下来要说的大致内容:
数据列表页面导出excel数据,
1、可以根据gridview的filter进行搜索数据并导出
2、可以自行扩展数据导出的时间直接导出数据
//先来看controller层,接收gridview参数并做拼接处理
php controller
//传参导出
$paramsexcel = ''; //这个参数是控制接收view层gridview::widget filter的参数
if ( ($params = yii::$app->request->queryparams) )
{
if ($params && isset($params['xxsearch']) && $params['xxsearch'])
{
foreach ($params['xxsearch'] as $k => $v)
{
if ($v)
{
$paramsexcel .= $k.'='.$v.'&';
}
}
}
$paramsexcel = rtrim($paramsexcel, '&');
}
//看view层我们需要做什么
php 输入页面上的html按钮
'btn btn-success']) ?>
开始时间:
结束时间:
上面javascript:ed()方法如下,注意这里我们拼接了controller层传递过来的参数,并自行扩展了时间进行搜索数据
//数据导出
function ed ()
{
var paramsexcel = ,
url = '/xx/export-data', //此处xx是控制器
starttime = $.trim($('input[name=start_time]').val()),
endtime = $.trim($('input[name=end_time]').val()),
temp = '';
//需要把view层gridview::widget filter的参数与我们自行扩展的参数拼接融合
if (paramsexcel)
{
temp += '?'+paramsexcel;
if (starttime)
temp += '&start_time='+starttime;
if (endtime)
temp += '&end_time='+endtime;
}
else if (starttime)
{
temp += '?start_time='+starttime;
if (endtime)
temp += '&end_time='+endtime;
}
else if (endtime)
{
temp += '?end_time='+endtime;
}
url += temp;
window.location.href=url; //url是我们导出数据的地址,上面的处理都只是进行参数的处理
}
//下面我们来看下导出数据的action,暂且命名为controller层的 actionexportdata,其中commonfunc是我们引入的全局性质的公共方法
use common\components\commonfunc;
/**
* @desc 数据导出
*/
public function actionexportdata ()
{
$where = '1';
$temp = '';
if ($_get)
{
foreach ($_get as $k => $v)
{
if ($k == 'start_time')
{
$t = date('y-m-d', strtotime($v)).' 00:00:00';
$temp .= 'create_time >= \''. $t . '\' and ';
}
elseif ($k == 'end_time')
{
$t = date('y-m-d', strtotime($v)).' 23:59:59';
$temp .= 'create_time getproperties()->setcreator(maarten balliauw);
$objphpexcel->getproperties()->setlastmodifiedby(maarten balliauw);
$objphpexcel->getproperties()->settitle(office 2007 xlsx test document);
$objphpexcel->getproperties()->setsubject(office 2007 xlsx test document);
$objphpexcel->getproperties()->setdescription(test document for office 2007 xlsx, generated using php classes.);
// add some data
$objphpexcel->setactivesheetindex(0);
//添加头部
$cheader = count($header);
for ($ci = 1; $ci 25) break;
$objphpexcel->getactivesheet()->setcellvalue($captions[$ci-1].'1', $header[$ci-1]);
}
//添加数据
$i = 2;
$count = count($data);
foreach ($data as $v)
{
$j = 0;
foreach ($v as $_k => $_v)
{
$objphpexcel->getactivesheet()->setcellvalue($captions[$j].$i, $_v);
$j++;
}
if ($i getactivesheet()->settitle($title);
// save excel 2007 file
$objwriter = new \phpexcel_writer_excel2007($objphpexcel);
header('pragma:public');
header(content-type:application/x-msexecl;name=\{$filename}.xls\);
header(content-disposition:inline;filename=\{$filename}.xls\);
$objwriter->save('php://output');
}
下面是最终的解决方案,也是非常实用的数据导出方案
/**
* @desc 数据导
* @notice 解决了上面导出列数过多的问题
* @example
* $data = [1, '小明', '25'];
* $header = ['id', '姓名', '年龄'];
* myhelpers::exportdata($data, $header);
* @return void, browser direct output
*/
public static function exportdata ($data, $header, $title = 'simple', $filename = 'data')
{
//require relation class files
require(yii::getalias('@common').'/components/phpexcel/phpexcel.php');
require(yii::getalias('@common').'/components/phpexcel/phpexcel/writer/excel2007.php');
if (!is_array ($data) || !is_array ($header)) return false;
$objphpexcel = new \phpexcel();
// set properties
$objphpexcel->getproperties()->setcreator(maarten balliauw);
$objphpexcel->getproperties()->setlastmodifiedby(maarten balliauw);
$objphpexcel->getproperties()->settitle(office 2007 xlsx test document);
$objphpexcel->getproperties()->setsubject(office 2007 xlsx test document);
$objphpexcel->getproperties()->setdescription(test document for office 2007 xlsx, generated using php classes.);
// add some data
$objphpexcel->setactivesheetindex(0);
//添加头部
$hk = 0;
foreach ($header as $k => $v)
{
$colum = \phpexcel_cell::stringfromcolumnindex($hk);
$objphpexcel->setactivesheetindex(0) ->setcellvalue($colum.'1', $v);
$hk += 1;
}
$column = 2;
$objactsheet = $objphpexcel->getactivesheet();
foreach($data as $key => $rows) //行写入
{
$span = 0;
foreach($rows as $keyname => $value) // 列写入
{
$j = \phpexcel_cell::stringfromcolumnindex($span);
$objactsheet->setcellvalue($j.$column, $value);
$span++;
}
$column++;
}
// rename sheet
$objphpexcel->getactivesheet()->settitle($title);
// save excel 2007 file
$objwriter = new \phpexcel_writer_excel2007($objphpexcel);
header('pragma:public');
header(content-type:application/x-msexecl;name=\{$filename}.xls\);
header(content-disposition:inline;filename=\{$filename}.xls\);
$objwriter->save('php://output');
}