代码 在此
/** 把一个二维数组 转换成 excel 表格
* @param array $data | 待转换数据
* @param array $pro | 需要设置的属性 自动判断 是否合法,只设置合法参数
* @param string $fileName | 下载后默认的文件名
*/
function arrayToDownload(Array $data, Array $pro = array(), $fileName = 'default')
{
Vendor("Classes.PHPExcel");
Vendor("Classes.PHPExcel.IOFactory.php");
Vendor("Classes.PHPExcel.Writer.Excel2007");
// 实例化 excel 类
$objPHPExcel = new \PHPExcel();
// 设置 文件属性
$objProps = $objPHPExcel->getProperties();
$pros = [
'creator', // 创作者
'lastmodifiedby', // 最后的修饰
'created', // 创建
'modified', // 修改
'title', // 标题
'description', // 描述
'subject', // 主题
'keywords', // 关键词
'category', // 类别
'company', // 单位
'manager', // 管理者
'customproperty' // 自定义属性
];
if($pro){
foreach ($pro as $k => $v){
// 不合法的跳过
if(!in_array(strtolower($k), $pros)){
continue;
}
$k = 'set'.$k;
// 自定义属性??
if(strtolower($k) == 'setcustomproperty'){
// 检测数据合法性
if(!is_array($v) && empty($v['name'])){
continue;
}
// 设置默认的 属性值
$v['value'] = $v['value'] ? $v['value'] : 'tripsters_jief' ;
// 设置默认的属性类型
$v['type'] = $v['type'] ? $v['type'] : NULL ;
$objProps -> $k ($v['name'], $v['value'], $v['type']);
continue;
}
$objProps -> $k ($v);
}
}
// 设置文件名
$date = date("Y_m_d",time());
$fileName = "{$fileName}_{$date}.xlsx";
$fileName = iconv("utf-8", "gb2312", $fileName);
// 设置 sheet
$objPHPExcel -> setActiveSheetIndex(0);
// 处理二维数组 生成表格
foreach($data as $k => $v){
if(!is_array($v)){
continue;
}
$row = $k + 1;
$col = 'A';
foreach ($v as $key => $val){
if(is_array($val)){
$val = implode(',', $val);
}
$objPHPExcel -> getActiveSheet() -> setCellValue($col.$row, $val);
$col ++;
}
}
//重命名 sheet
// $objPHPExcel->getActiveSheet()->setTitle('test');
// 设置header 文件下载
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"$fileName\"");
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output'); //文件通过浏览器下载
exit;
}
主要几点
- 我用的是双层循环嵌套,这样可以导出 列数不同的数据。
- 第一层 是行数据, 第二层是列数据,在php 中
$a = 'A'; $a++;
此时的$a
就是 'B'
;所以 第二层循环中直接 简化成 $col ++;
- 设置属性 通过一个合法数组过滤当然还有其他方法, 这只是我现在能想到的一种。
- 设置属性 不是很明白每一个啥意思。
评论已关闭