yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法
作者:白狼 出处: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按钮
<div style="margin-bottom: 30px;">
<?= Html::a('导出', 'javascript:ed();', ['class' => 'btn btn-success']) ?>
开始时间:<input type="text" name="start_time" />
结束时间:<input type="text" name="end_time" />
</div>
上面javascript:ed()方法如下,注意这里我们拼接了controller层传递过来的参数,并自行扩展了时间进行搜索数据
//数据导出
function ed ()
{
var paramsExcel = "<?php echo $paramsExcel; //controller传递过来的参数?>",
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 <= \''. $t . '\' AND ';
}
else
{
$temp .= $k . '=\'' . $v . '\' AND ';
}
}
$temp = rtrim($temp, ' AND');
} if ($temp) $where .= ' AND '.$temp;
//查询数据
$data = ...... if ($data)
{
//数据处理
}
$header = ['id', '用户账号', '创建时间']; //导出excel的表头 CommonFunc::exportData($data, $header, '表头', '文件名称');
}
上面CommonFunc::expertData方法是我们底层扩展php-excel类封装的公共方法,这里才是我们要说的关键,关于 PHPExcel类文件大家可自行下载
No1. 我们走了一个小的弯,分享给大家看看
CommonFunc::expertData方法如下:
/**
* @DESC 数据导出
* @notice max column is z OR 26,overiload will be ignored
* @notice 缺点:导出数据的列数大于26时报错
* @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; //列数
$captions = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; $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); //添加头部
$cheader = count($header);
for ($ci = 1; $ci <= $cheader; $ci++)
{
if ($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 <= $count)
{
$i ++;
}
} // 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');
}
下面是最终的解决方案,也是非常实用的数据导出方案
/**
* @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');
}
yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法的更多相关文章
- PHPExcel导出数据时字段超过26列出错Invalid cell coordinate [1
http://blog.csdn.net/dl425134845/article/details/46650961 以下是解决方案函数 /** * 方法名: getExcel * 作用 ...
- PHPEXCEL导出excel表格中长数字文本自动转为科学计数法的解决办法
方法一:前面加空格 $objActSheet->setCellValue('A1', ' '.'330602198804224688'); 方法二: $objActSheet->setCe ...
- C# 使用Epplus导出Excel [2]:导出动态列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [1]:导出固定列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- phpexcel导出超过26列解决方案
原文:phpexcel导出超过26列解决方案 将列的数字序号转成字母使用,代码如下: PHPExcel_Cell::stringFromColumnIndex($i); // 从o,1,2,3,.. ...
- java POI导出Excel文件数据库的数据
在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...
- js导出excel:前端当前数据的导出
网上找的库文件,同样做了修改.在导出的时候,有时候数据第一列和最后一列可能是复选框和操作按钮,这个是我们不需要的,加了这个的过滤 //table2excel.js /* * jQuery table2 ...
- java代码导出数据到Excel、js导出数据到Excel(三)
jsp内容忽略,仅写个出发按钮: <button style="width: 100px" onclick="expertExcel()&quo ...
- (原创)将Datatable数据按照Excel模板格式导出
最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...
随机推荐
- 使用DocX开源组件,实现动态数据的填充。
1.先解释一下,什么叫做动态数据,动态数据指的是,一条数据的格式固定,但数据的条数不固定. 2.应用环境,在一个表格当中如果,现在表格有三行n列,如果你需要在表格第一行后添加同等规格的一行或n行,应该 ...
- 【C#进阶系列】19 可空值类型
可空值类型,正如字面意义上的,是可以为NULL的值类型. 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单. 实际上可空值类型就是Nullable<T ...
- PHP中利用GD实现的柱状图
PHP中利用GD实现的柱状图,自己写的一个画柱状图的类,上代码. <?php Class Chart{ private $image; // 定义图像 private $title; // 定义 ...
- XE8 FMX SpeedButton 大图标(改 Style)
自从 XE8 提供 ImageList 带来了很多便利,但 SpeedButton 的图标太小(不够大气),还好 FMX 提供了 Style 可供使用者自订图标大小及显示位置,请自行按图索骥,做一遍: ...
- ARP (地址解析协议)
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机, ...
- php中数组遍历改值
<?php $arr = array(100, 99, 88, 77, 55, 66); //方法1 foreach ($arr as &$v) { $v = 2; } print_r( ...
- 为mongodb数据库添加安全账户
最近的数据库服务器有些不稳定,遇到了黑客的骚扰,mongodb的安全存在一些漏洞.首要任务是给数据库添加账号.之前大家都习惯于mongodb的不加安全账号和密码来连接数据库,那么问题是添加了安全账户后 ...
- js 字符串 replace replaceAll
var str = "男的女的老的少的"; alert(str.replace('的','')); 可以看到替换后的str的值为"男女的老的少的",replac ...
- BOOtstrap源码分析之 tooltip、popover
一.tooltip(提示框) 源码文件: Tooltip.jsTooltip.scss 实现原理: 1.获取当前要显示tooltip的元素的定位信息(top.left.bottom.right.wid ...
- 记STM32F030多通道ADC DMA读取乱序问题
问题描述通过 uint16_t ConvData[8]保存DMA搬运的ADC转换数值,但是这个数组数值的顺序总是和ADC不是顺序对应的.比如用7个通道的ADC,当设置ADC_InitStructure ...