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

PHP生成Excel之表格(二)

2018-03-27 22:20 274 查看
php使用phpexcel提供的操作方法,生成excel。

遇到的问题

上一篇文章中PHP生成Excel之表格(一),给出了常规情况下使用phpexcel来生成excel的方法。但是这种方法很麻烦,还需要翻文档查看很多方法。而且生成的样式也不是最完美的。那么这篇文章,我们就思考如何解决这个,既繁琐又不完美的生成方式。

思考

之前结束phpexcel这个插件时,有说到。除了能读取excel、生成excel外还能修改excel。换而言之,我们能打开一个一直配置好样式的excel,然后修改或者写入我们的数据,最后再保存。貌似这个思路可行。

Excel模板

在写代码前,我们需要准备一个excel模板。同时需要把样式调试好。



按照思路,我们现在,只需要打开这个文件。然后把数据写入到空白的地方。

代码演示

// $data 为三维数组数据源。
// $outputname  为导出的文件名。
public function  ExportExcelForCopy($data,$outputname){
$filename = "../web/excelmodel/excel_copy.xlsx";
$objReader = new \PHPExcel_Reader_Excel2007();
//读取文件到对象中
$resultPHPExcel = $objReader->load($filename);
$outputFileName = $outputname.date('Y_m_d_H_i').'.xlsx';

$i = 0;
// 这里的循环用于写入到sheet
foreach ($data as $key => $value) {
//取第一个sheet
$resultPHPExcel->setActiveSheetIndex($i);
$i=$i+1;
//数据写入 第三个参数为开始的行数。
$this->_new_exprot_excel($value,$resultPHPExcel,96);
}

$xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel);
$savepath = Yii::$app->basePath.'/uploads/tmp_excel/'.date('Ym',time()).'/';
if(!is_dir($savepath)){
mkdir($savepath,0777,true);
}
//输出到浏览器
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" );
}

/* 数据写入方法 */
public function _new_exprot_excel($data,$resultPHPExcel,$mun=1){
$i = $mun;
foreach($data as $item){
foreach($item as $key=>$val){
$cellID=self::stringFromColumnIndex($key).$i;
// 这里是读取单元格内容。当为空的时候才写入数据。
$date = $resultPHPExcel->getActiveSheet()->getCell($cellID)->getValue();
if ($date=='') {
$resultPHPExcel->getActiveSheet()->setCellValue($cellID,$val);
}
}
$i ++;
}

}


我的习惯,把注释写到代码中。这样也比较好明确到行上。基本上代码内容个前一篇文章一样。就是少了样式配置的内容。多了读取excel文件的部分。整体看,代码简洁易懂。代码量也少了很多。

看着好像没有什么问题,那就看看执行效果吧。

Excel效果



暂时不看第二个表格无样式部分。有样式部分是不是跟目标excel一模一样?

简短的代码,实现效果比之前好很多。或者说跟要求一模一样。唯一的缺陷就是,这是一个长度可变的数组(excel列数不固定,无法配样式)。如果报表固定长度,那我们实现方式就完美了。

分析问题

从生成的效果来看,如果一个报表宽高固定,就能采用这种方式生成excel。简答、高效。修改起来也方便,关一个模板,代码都不需要修改。

到这里,小部分的报表,对于我们没什么问题了。但是为了能支持更多的报表,使生产excel一点都不困难,还是需要优化一下,而且也是可以优化的。

从报表看,我们只要解决下面问题,可变数组生成excel的问题也能解决了。

excel中的样式能否复制?

怎么把单元格样式,复制到其他单元格?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息