博客
关于我
phpexcel不完全研究(一)导出excel文件
阅读量:383 次
发布时间:2019-03-05

本文共 4283 字,大约阅读时间需要 14 分钟。

PhpExcel 导出 Excel 表格:自动存储与性能优化

在最近的项目中,我需要将数据导出为 Excel 表格。为了实现自动存储到固定位置,我选择使用 PhpExcel 这个库。以下是我在实际应用中使用的经验与解决方案。


一、导出 Excel 的两种方法

在实际开发中,我尝试了两种方法:

  • 原生导出

    这种方法简单易用,但没有自动存储功能。以下是代码示例:

    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 方法将数据一次性导入,减少循环执行。

  • 使用批量写入

    如果需要处理大量数据,可以使用批量写入功能。


  • 五、总结

    在实际应用中,我发现:

    • 如果数据量较小且格式化需求简单,原生导出方法更高效。
    • 如果需要复杂格式化和自动存储功能,PhpExcel 是更好的选择。
    • 数据量较大时,需要优化代码以提高性能。

    通过上述方法,我成功实现了 Excel 表格的自动存储与格式化,同时解决了科学计数问题。如果有更多需求或问题,欢迎在评论区留言!

    转载地址:http://flhwz.baihongyu.com/

    你可能感兴趣的文章
    Neo4j的安装与使用
    查看>>
    Neo4j(2):环境搭建
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    netsh advfirewall
    查看>>
    Netty WebSocket客户端
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>