您的位置:首页 > 编程语言 > PHP开发

PHP生成Excel之表格(一)

2018-03-25 21:56 246 查看
文章使用phpexcel提供的操作方法,生成excel文件。

Excel目标

我们将要生成的excel最终效果如下图显示。



代码演示

public static function ExportExcel($data,$filename=''){
$data; //数据数组(三维数组)
$filename=empty($filename)?"":$filename;
$resultPHPExcel = new \PHPExcel();
$sheet_title = "每日效果走势图";
// 设置sheet名称
$resultPHPExcel->getActiveSheet()->setTitle($sheet_title);
// 边框配置数组
$styleArray = array(
'borders' => array(
'allborders' => array(
//'style' => PHPExcel_Style_Border::BORDER_THICK,//边框是粗的
'style' => \PHPExcel_Style_Border::BORDER_THIN,//细边框
//'color' => array('argb' => 'FFFF0000'),
),
),
);

//数据开始
$i = 102;
$j = $i;
// 设置所在行的字体、大小、加粗
$resultPHPExcel->getActiveSheet()->getStyle($i)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true);
$resultPHPExcel->getActiveSheet()->getStyle($i+29)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true);
// 设置所在行的字体、大小、加粗、颜色
$resultPHPExcel->getActiveSheet()->getStyle($i+1)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
$resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
// 设置区域范围内的单元格背景颜色
$resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+1))->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040');
$resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040');
// 给范围内的表格加上边框
$resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+26))->applyFromArray($styleArray);
//单元格范围内,格式化数字。(取整,百分比)
$resultPHPExcel->getActiveSheet()->getStyle('B104:B123')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
$resultPHPExcel->getActiveSheet()->getStyle('B124:B128')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);
$resultPHPExcel->getActiveSheet()->getStyle('133:148')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
$resultPHPExcel->getActiveSheet()->getStyle('149:152')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);

//循环数组,写入数据。
foreach($data['list'] as $item){
foreach($item as $key=>$val){
// 获取列的标识
$columnID = self::stringFromColumnIndex($key);
$cellID=self::stringFromColumnIndex($key).$i;
//设置单元格内容水平居中
$resultPHPExcel->getActiveSheet()->getStyle($cellID)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//数据写入单元格
$resultPHPExcel->getActiveSheet()->setCellValue($cellID,$val);
// 非A列时,设置单元格宽度为15
if ($columnID!='A') {
$resultPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth(15);
}
}
$i ++;
}
// 设置A列的单元格宽度
$resultPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
//在单元格范围内,给表格添加边框
$resultPHPExcel->getActiveSheet()->getStyle('A'.($j+30).':'.$columnID.($j+50))->applyFromArray($styleArray);
$sum = $arrayLegth-3;
//表格末尾两行,写入数据
$resultPHPExcel->getActiveSheet()->setCellValue('A153','备注:表格内各数据单位为万;线索单位为条');
$resultPHPExcel->getActiveSheet()->getStyle('A153')->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED);

$outputFileName = $filename.date('Y_m_d_H_i').'.xlsx';
$xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel);
//输出到浏览器
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$outputFileName.'"');
header("Content-Transfer-Encoding: binary");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$xlsWriter->save( "php://output" );
exit;
}


关于代码

以上代码只是生成excel的核心部分。数据源部分、和其他一些方法的调用都没有给出。

关于数据数组

这里我个人习惯将输出数组拼接成一个三维数组。由外到内,第一维度为sheet页、第二维度为表格的行、第三维度为表格的列。二三维度可以具体到一个单元格。

关于数据写入

phpexcel的写入数据,是需要指定单元格的。所以,必须转换成excel的列表示方式(英文字母)

其他补充

基本上代码上都给了比较详细的注释。那如果对这些操作样式的方法不熟悉,还是需要去看一下文档。后面有时间我会专门出一篇文章来解释文档。

Excel效果



和我们的目标对比发现,好像有很多区别。比如:

许多颜色样式没有配置。

数字格式没有千分位分割符。

除了有内容的单元格,其他的单元格应该是空白。

……

存在的问题

从我们的代码上看,发现通过phpexcel官方提供的操作对象去生成excel是存在许多问题的。(以下问题不一定能通过上面内容反映)

配置样式比较繁琐,复杂的样式可能需要大量代码去支持。

虽然提供了行和列整体的操作。但是存在单元格合并时,整行或者整列的配置会失效。而且整行或者整列配置样式时,会导致把表格外部带入样式,比较难看。

虽有提供默认样式配置,但是多种配置在同一个单元格时,会出现默认失效的问题。调试比较麻烦。

单元格的自动宽度,对于中文支持不好。

这种生成excel的方式存在许多问题,但是还是能尽量避免的。解决方法可以尝试。

尽量通过循环,把样式配置到单元格上。

样式设置时,有限默认样式->写入数据->单元格样式配制的方式。这种方式一般不会出现配置后不生效的问题。

寻求别的途径

既然样式的配置,那么繁琐又增加代码量。那么有没有什么别的方式来解决这个问题呢?

答案肯定是有的,不然这篇文章就没有意见。在上一篇文章介绍phpexcel时,有说道。phpexcel能读取、生成、修改excel文件。那么出力直接生成excel文件,能否能使用别的方式间接生成呢?

下一篇文件,主要讨论如何放弃繁琐的样式配置,生成跟目标文件一样样式的文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息