博客
关于我
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/

    你可能感兴趣的文章
    NIO与零拷贝和AIO
    查看>>
    NIO同步网络编程
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NIO笔记---上
    查看>>
    NIO蔚来 面试——IP地址你了解多少?
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NISP国家信息安全水平考试,收藏这一篇就够了
    查看>>
    NIS服务器的配置过程
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>