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

本文共 4391 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本
    查看>>
    Node-RED中使用JSON数据建立web网站
    查看>>
    Node-RED中使用json节点解析JSON数据
    查看>>
    Node-RED中使用node-random节点来实现随机数在折线图中显示
    查看>>
    Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
    查看>>
    Node-RED中使用node-red-contrib-image-output节点实现图片预览
    查看>>
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中使用range范围节点实现从一个范围对应至另一个范围
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    查看>>
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>