本文共 4391 字,大约阅读时间需要 14 分钟。
在最近的项目中,我需要将数据导出为 Excel 表格。为了实现自动存储到固定位置,我选择使用 PhpExcel 这个库。以下是我在实际应用中使用的经验与解决方案。
在实际开发中,我尝试了两种方法:
原生导出
这种方法简单易用,但没有自动存储功能。以下是代码示例:public function actionPutExcel(){ $admin = M('admin'); $dbbacklist = $admin->select(); $title = ["序号","用户名","密码","登陆时间"]; exportexcel($dbbacklist, $title);}function exportexcel($data=array(), $title=array(), $filename='report'){ ob_end_clean(); ob_start(); header("Content-type:application/octet-stream"); header("Accept-Ranges:bytes"); header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=".$filename.".xls"); header("Pragma: no-cache"); header("Expires: 0"); //导出xls 开始 if (!empty($title)){ foreach ($title as $k => $v) { $title[$k]=iconv("UTF-8", "GB2312",$v); } $title= implode("\t", $title); echo "$title\n"; } if (!empty($data)){ foreach($data as $key=>$val){ foreach ($val as $ck => $cv) { $data[$key][$ck]=iconv("UTF-8", "GB2312", $cv); } $data[$key]=implode("\t", $data[$key]); } echo implode("\n",$data);} 优点:简单快捷,数据量小时性能较好。
缺点:没有自动存储功能,且对数字较长的处理支持有限(容易出现科学计数)。
PhpExcel 导出
使用 PhpExcel 可以实现更灵活的 Excel 导出,同时支持批量存储。以下是我的实现代码:public function import_xls(){ $admin = M('admin'); $data = $admin->select(); $tabhead = array( 'A1' => "序号", 'B1' => "用户名", 'C1' => "密码", 'D1' => "登陆时间" ); $rowwidth = array( 'A' => 10, 'B' => 30, 'C' => 50, 'D' => 30, ); $filename = "excel" . date("Y-m-d H:i:s", time()); $this->create_xls($data, $filename, $tabhead, $rowwidth);}public function create_xls($data, $filename, $tabhead, $rowwidth){ ini_set('max_execution_time', '0'); Vendor('PHPExcel.PHPExcel'); $filename = str_replace('.xls', '', $filename) . '.xls'; $phpexcel = new PHPExcel(); //设置文件属性 $phpexcel->getProperties() ->setCreator("Maarten Balliauw") ->setLastModifiedBy("Maarten Balliauw") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") ->setKeywords("office 2007 openxml php") ->setCategory("Test result file"); //创建工作表 $phpexcel->getActiveSheet()->setTitle('Sheet1'); $phpexcel->setActiveSheetIndex(0); $objActSheet = $phpexcel->getActiveSheet(); //设置头部 foreach ($tabhead as $key => $val) { $phpexcel->getActiveSheet()->setCellValue($key, $val); } //设置单元格宽度 foreach ($rowwidth as $key => $val) { $phpexcel->getActiveSheet()->getColumnDimension($key)->setWidth($val); } //插入数据 $i = 2; foreach ($data as $value) { $j = 'A'; foreach ($value as $value2) { $objActSheet->setCellValue($j . $i, $value2); $j++; } $i++; } //设置文件命名为当前时间 $filename = "excel" . date("Y-m-d H:i:s", time()); //保存到指定路径 $objwriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5'); $objwriter->save('var/www/excel/' . $filename); exit;} 优点:支持复杂格式化、多种格式导出、自动存储到指定路径。
缺点:处理大量数据时性能较低,需要优化代码。
在实际应用中,我遇到了一个问题:一些数字会被显示为科学计数形式(如 1.23E+5)。为了解决这个问题,可以在单元格中添加空格,将数字转换为字符串。
$num = 123456789987456;$str = '' . $num; // 或 $num = string($num);
这样可以避免科学计数的显示。
在 PhpExcel 中,可以通过 PHPExcel_IOFactory::createWriter 创建一个 Excel5 格式的写入器,并将文件保存到指定路径。
use PHPExcel_IOFactory;// 创建一个新的 Excel 文件$phpexcel = new PHPExcel();$filename = "excel" . date("Y-m-d H:i:s", time());$phpexcel->getActiveSheet()->setTitle('Sheet1');$phpexcel->setActiveSheetIndex(0);// 设置文件路径$filePath = 'var/www/excel/' . $filename;// 创建写入器$objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');$objWriter->save($filePath);// 退出 PHP 并输出结果exit; 这样,生成的 Excel 文件会自动存储到指定路径。
在处理大量数据时,PhpExcel 的性能可能会显著下降。以下是一些优化方法:
减少代码执行时间
使用ob_get_flush() 替代 ob_end_clean() 和 ob_start(),以减少内存占用。 关闭自动对象创建
在create_xls 函数中,关闭自动对象创建以提高性能。 预先设置工作表数据
使用fromArray 方法将数据一次性导入,减少循环执行。 使用批量写入
如果需要处理大量数据,可以使用批量写入功能。在实际应用中,我发现:
通过上述方法,我成功实现了 Excel 表格的自动存储与格式化,同时解决了科学计数问题。如果有更多需求或问题,欢迎在评论区留言!
转载地址:http://flhwz.baihongyu.com/