@H_502_0@
一.普遍导出方法
@H_502_0@excel导出的方法网上有很多,在crm或是oa系统中导出excel是常有的事,做过的此功能人都知道,其主要操作其实是循环数据列表,然后一格一格地添加数据到固定的单元格中。只要做好了一次,其后只要复制相关代码修改修改,其他地方导出功能也就完成了。 @H_502_0@但是这样会有两个问题:
@H_502_0@ 1.当列表数据字段修改时,需要修改大量的代码,维护艰难,改着难受; @H_502_0@ 2.多次出现导出功能时,需要在多个地方复制大量的重复冗余代码,看着难受; @H_502_0@因此,有必要统一一个导出excel的方法,使用时,只需要传入数据的表头,表头字段名,数据列表,以及数据表名称,就能导出excel了。 @H_502_0@二.使用通用的导出方法
@H_502_0@如下图所示,只要传入4个参数,就能完成导出,使用和维护就变得简单多了。PHP;">
//AAA转换
public static function toAAA($dec)
{
if ($dec < 0) return '';
$y = $dec % 26;
$x = floor($dec / 26);
return self::toAAA($x - 1) . chr($y + 65);
}
@H_502_0@最后,附上完整代码
@H_502_0@框架为Yii2,excel导出组件为moonlandsoft/yii2-PHPexcel; @H_502_0@其他类似chr(65)
foreach ($titles as $k => $v) {
$keys[] = self::toAAA($k);
}
$objPHPExcel = new \PHPExcel();
$objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
$objPHPExcel->setActiveSheetIndex(0);
$activeSheet = $objPHPExcel->getActiveSheet();
$activeSheet->setTitle($name);
$activeSheet->getStyle("A1:{$keys[$count-1]}1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$activeSheet->mergeCells("A1:{$keys[$count-1]}1");
$activeSheet->setCellValue('A1',$name);
//设置title,样式
foreach ($titles as $key => $title) {
$activeSheet->setCellValue($keys[$key] . '2',$title);
$activeSheet->getColumnDimension($keys[$key])->setWidth(20);
$activeSheet->getRowDimension(($key + 1))->setRowHeight(18);
}
$i = 3;
foreach ($list as &$item) {
foreach ($keys as $k => $v) {
$val = isset($item[$fields[$k]]) ? $item[$fields[$k]] . ' ' : ' ';
$activeSheet->setCellValue($v . $i,$val);
}
$i++;
}
$fileName = $name . "_" . date('Y_m_d_His') . '.xlsx';
header("Cache-Control: public");
header("Pragma: public");
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=" . iconv("utf-8","GB2312//TRANSLIT",$fileName));
header('Content-Type:APPLICATION/OCTET-STREAM');
ob_clean();
ob_start();
$objWriter->save('PHP://output');
ob_end_flush();
}
//AAA转换
public static function toAAA($dec)
{
if ($dec < 0) return '';
$y = $dec % 26;
$x = floor($dec / 26);
return self::toAAA($x - 1) . chr($y + 65);
}
@H_502_0@