热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHPexecl导出一个复杂的表头-PHP源码

PHPexecl导出一个复杂的表头
  1. php代码

getSheetCount(); //得到Execl中包含的Sheet工作簿的数量
                  
                 for($i=0;$i<$sheetCount;$i++)
                 {
                    $ActiveSheet = $PHPExeclObj->getSheet($i);
                    $highestRow = $ActiveSheet->getHighestRow(); // 取得总列数
                    $allColumn  = $ActiveSheet->getHighestColumn();
     
                    //通过嵌套循环来读取sheet工作簿里面的内容
                    for($Col=&#39;A&#39;;$Col<$allColumn;$Col++)
                    {
                        for($Row=1;$Row<$highestRow;$Row++)
                        {
                              $Data[$Col][$Row] = $ActiveSheet->getCell($Col.$Row)->getValue();
                        }
                    }
 
                 }
             }
              
             return $Data;
 
    }
     
     
    /*
     * 将数据写入到数据表中
     * $Data Array 表示要插入进Execl数据
     * $RuleData Array 表示数据格式的规则数组
     * $i int 表示从第几行起的插入数据
     * **/
     
    public static function SummerInsertDateToExecl($sheet,$Head,$Data,$n=3,$RuleData=array())
    {
        $SimpleHead = self::getHead($Head);
         
        $row = $n;
        foreach($Data as $key=>$valueArr)
        {       
            $m = 0;
            foreach($valueArr as $k=>$v)
            {
                $StartCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
                $sheet->getCell($StartCol)->setValue($v);
 
                $sheet->getStyle($StartCol)->getAlignment()->applyFromArray(
                        array(
                                &#39;horizontal&#39;=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
                                &#39;vertical&#39;  => PHPExcel_Style_Alignment::VERTICAL_CENTER,
                                &#39;rotation&#39;  => 0,
                                &#39;wrap&#39;      => TRUE,
                        )
                );
                 
                             
                if(isset($SimpleHead[$k][&#39;col&#39;]))
                {
                    $m = $m + $SimpleHead[$k][&#39;col&#39;]-1;
                    $endCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
                    $sheet->mergeCells($StartCol.":".$endCol);
                }
                 
                $m++;
                 
                $type = false;
                 
                if(isset($SimpleHead[$k][&#39;type&#39;]))
                {
                     $type = $SimpleHead[$k][&#39;type&#39;];
                     $AllowArray = $SimpleHead[$k][&#39;allowarray&#39;];
                }
                 
                //设置单元格的数据验证
                if($type)
                {
                    switch ($type)
                    {
                        case &#39;list&#39;:
                            self::setSelectionRange($sheet, $StartCol,$AllowArray);
                        break;
                        case &#39;range&#39;:
                            self::setValueRange($sheet, $StartCol,$AllowArray);
                        break;
                    }
                }
 
            }
            $row ++ ;
        }
          
    }
         
    /*
     * 生成Execl单元格备注
     * $sheet 当前的工作簿对象
     * $Cell 需要设置属性的单元格
     * $content 备注内容
     * */
    private static function setComment($sheet,$Cell,$content)
    {
        $sheet->getComment($Cell)->setAuthor(&#39;4399om&#39;);
        $objCommentRichText = $sheet->getComment($Cell)->getText()->createTextRun(&#39;4399om:&#39;);
        $objCommentRichText->getFont()->setBold(true);
        $sheet->getComment($Cell)->getText()->createTextRun("\r\n");
        $sheet->getComment($Cell)->getText()->createTextRun($content);
        $sheet->getComment($Cell)->setWidth(&#39;100pt&#39;);
        $sheet->getComment($Cell)->setHeight(&#39;100pt&#39;);
        $sheet->getComment($Cell)->setMarginLeft(&#39;150pt&#39;);
        $sheet->getComment($Cell)->getFillColor()->setRGB(&#39;EEEEEE&#39;);
    }
     
    /*
     * 现在单元格的有效数据范围,暂时仅限于数字
     * $sheet 当前的工作簿对象
     * $Cell 需要设置属性的单元格
     * $ValueRange array 允许输入数组的访问
     */
    private static function setValueRange($sheet,$Cell,$ValueRange)
    {
        //设置单元格的的数据类型是数字,并且保留有效位数
        $sheet->getStyle($Cell)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
         
        $ValueRange = explode(",",$ValueRange);
         
        //开始数值有效访问设定
        $objValidation = $sheet->getCell($Cell)->getDataValidation();
        $objValidation->setType( PHPExcel_Cell_DataValidation:: TYPE_WHOLE );
        $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation:: STYLE_STOP );
        $objValidation->setAllowBlank(true);
        $objValidation->setShowInputMessage( true);            //设置显示提示信息
        $objValidation->setShowErrorMessage( true);            //设置显示错误信息
        $objValidation->setErrorTitle(&#39;输入错误&#39;);              //错误标题
        $objValidation->setError(&#39;请输入数据范围在从&#39;.$ValueRange[0].&#39;到&#39;.$ValueRange[1].&#39;之间的所有值&#39;);       //错误内容
        $objValidation->setPromptTitle(&#39;允许输入&#39;);         //设置提示标题
        $objValidation->setPrompt(&#39;请输入数据范围在从&#39;.$ValueRange[0].&#39;到&#39;.$ValueRange[1].&#39;之间的所有值&#39;); //提示内容
        $objValidation->setFormula1($ValueRange[&#39;0&#39;]);     //设置最大值
        $objValidation->setFormula2($ValueRange[&#39;1&#39;]);     //设置最小值
         
    }
     
 
    private static function OutinputHeader($objWriter)
    {
        $fileName = str_replace(&#39;.php&#39;, &#39;.xlsx&#39;, pathinfo(__FILE__, PATHINFO_BASENAME));
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header(&#39;Content-Disposition:inline;filename="&#39;.$fileName.&#39;"&#39;);
        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");
        $objWriter->save(&#39;php://output&#39;);
        exit;
    }
     
    //数据控制,设置单元格数据在一个可选方位类
    private static function setSelectionRange($sheet,$Cell,$rangeStr,$Title="数据类型")
    {
     
        $objValidation = $sheet->getCell($Cell)->getDataValidation();
        $objValidation -> setType(PHPExcel_Cell_DataValidation::TYPE_LIST)
            -> setErrorStyle(PHPExcel_Cell_DataValidation::STYLE_STOP)
            -> setAllowBlank(true)
            -> setShowInputMessage(true)
            -> setShowErrorMessage(true)
            -> setShowDropDown(true)
            -> setErrorTitle(&#39;输入的值有误&#39;)
            -> setError(&#39;您输入的值不在下拉框列表内.&#39;)
            -> setPromptTitle(&#39;"&#39;.$Title.&#39;"&#39;)
            -> setFormula1(&#39;"&#39;.$rangeStr.&#39;"&#39;);   
    }
     
     
     
    /*
     * 构建表头
     * */
    public static function RecursionCreateExecl($head,$data)
    {
 
        $PHPExecl = new PHPExcel();
             
        $objWriter = self::createWriter($PHPExecl, &#39;Excel2007&#39;);
         
        $PHPExecl->getProperties()->setCreator("4399om")
        ->setLastModifiedBy("Summer")
        ->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");
         
        $PHPExecl->setActiveSheetIndex(0);
         
        $sheet = $PHPExecl->getActiveSheet();
         
        self::HandleHeadToNode($sheet, $head,1,0,0);
         
        self::SummerInsertDateToExecl($sheet,$head,$data,4);
 
        self::OutinputHeader($objWriter);
 }
  
 private static function HandleHeadToNode($sheet,$Head,$beginRow,$col,$StartCol)
 {
    foreach($Head as $key=>$cells)
    {
            $row = $beginRow; //表示行
         
            $beginCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
             
            $sheet->getCell($beginCol)->setValue($cells[&#39;value&#39;]);
             
            //设置表格样式
            $sheet->getStyle($beginCol)->getAlignment()->applyFromArray(
                    array(
                            &#39;horizontal&#39;=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
                            &#39;vertical&#39;  => PHPExcel_Style_Alignment::VERTICAL_CENTER,
                            &#39;rotation&#39;  => 0,
                            &#39;wrap&#39;      => TRUE,
                    )
            );
             
            $sheet->getStyle($beginCol)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_DARKGREEN);
             
            //设置单元格的宽度
            if(isset($cells[&#39;width&#39;]))
            {
                $Cell = $sheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($col));
                $Cell->setWidth($cells[&#39;width&#39;]);
            }
             
            //哥元素打上标记
            if(isset($cells[&#39;Content&#39;]))
            {
                self::setComment($sheet, $beginCol, $cells[&#39;Content&#39;]);
            }
              
            $merge = false; //合并单元格
            if(isset($cells[&#39;col&#39;]))
            {
                $col += $cells[&#39;col&#39;]-1;
                $merge = true;
            }
              
            if(isset($cells[&#39;row&#39;]))
            {
                $row += $cells[&#39;row&#39;]-1;
                $merge = true;
            }
             
            if($merge)
            {
                $endCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
                $sheet->mergeCells($beginCol.":".$endCol);
            }
             
            $row ++;    
            $col ++;
         
            //表示有存在孩子节点
            if(isset($cells[&#39;children&#39;]) && is_array($cells[&#39;children&#39;])){ 
                $cols = $StartCol;
                $n = count($cells[&#39;children&#39;]);
                if(!self::IsExistChildren($cells[&#39;children&#39;]))
                {       
                    $cols     = $col-$n;
                    $StartCol = $col;
                }
 
                self::HandleHeadToNode($sheet,$cells[&#39;children&#39;],$row,$cols,$StartCol);
            }else{
                $StartCol = $col;
            }
         
 
     }
         
 }
 
  //判断自己的孩子节点中是否存在孙子节点
  private static function IsExistChildren($Data)
  {
      foreach($Data as $key=>$value)
      {
           if(isset($value[&#39;children&#39;]) && is_array($value[&#39;children&#39;]))
           {
               return true;
           }
      }
      return false;
  }
   
   
  //获取底层数据
  private static function getHead($Head,&$Node=array())
  {
    foreach($Head as $key=>$value)
    {
        if(isset($value[&#39;children&#39;]) && is_array($value[&#39;children&#39;]))
        {
            self::getHead($value[&#39;children&#39;],$Node);
        }
        else
        {   
            $Node[] = $value;
        }
    }
         
    return $Node;
  }
   
}
 
 
 
 
$Head = array(
            array(&#39;value&#39;=>&#39;姓名&#39;,&#39;col&#39;=>2,&#39;row&#39;=>2,&#39;width&#39;=>20,&#39;type&#39;=>&#39;list&#39;,&#39;allowarray&#39;=>&#39;邓蔚之,李永航&#39;),
            array(&#39;value&#39;=>&#39;第一天&#39;,&#39;col&#39;=>4,&#39;row&#39;=>1,&#39;width&#39;=>20,&#39;Content&#39;=>&#39;2014-12-29号&#39;,
                    &#39;children&#39;=>
                     array(
                        array(&#39;value&#39;=>&#39;上午&#39;,&#39;col&#39;=>1,&#39;width&#39;=>20,&#39;type&#39;=>&#39;range&#39;,&#39;allowarray&#39;=>&#39;10,100&#39;),
                        array(&#39;value&#39;=>&#39;中午&#39;,&#39;col&#39;=>1,&#39;width&#39;=>20,&#39;type&#39;=>&#39;range&#39;,&#39;allowarray&#39;=>&#39;10,100&#39;),
                        array(&#39;value&#39;=>&#39;下午&#39;,&#39;width&#39;=>20),
                        array(&#39;value&#39;=>&#39;晚上&#39;,&#39;width&#39;=>20),
                    ),
                     
            ),
            array(&#39;value&#39;=>&#39;第二天&#39;,&#39;col&#39;=>2,&#39;row&#39;=>1,&#39;width&#39;=>20,
                    &#39;children&#39;=>
                     array(
                        array(&#39;value&#39;=>&#39;上午&#39;,&#39;width&#39;=>20),
                        array(&#39;value&#39;=>&#39;下午&#39;,&#39;width&#39;=>20),
                     ),
            ),
);
 
 
$data = array(
            array(&#39;邓蔚之&#39;,&#39;12&#39;,&#39;吃饭1&#39;,&#39;睡觉1&#39;,&#39;起床刷牙2&#39;,&#39;吃饭睡觉2&#39;),
            array(&#39;邓蔚之&#39;,&#39;25&#39;,&#39;吃饭1&#39;,&#39;睡觉1&#39;,&#39;起床刷牙2&#39;,&#39;吃饭睡觉2&#39;),
            array(&#39;邓蔚之&#39;,&#39;50&#39;,&#39;吃饭1&#39;,&#39;睡觉1&#39;,&#39;起床刷牙2&#39;,&#39;吃饭睡觉2&#39;),
            array(&#39;邓蔚之&#39;,&#39;99&#39;,&#39;吃饭1&#39;,&#39;睡觉1&#39;,&#39;起床刷牙2&#39;,&#39;吃饭睡觉2&#39;),
            array(&#39;邓蔚之&#39;,&#39;10&#39;,&#39;吃饭1&#39;,&#39;睡觉1&#39;,&#39;起床刷牙2&#39;,&#39;吃饭睡觉2&#39;),
        );
 
$Node = PHPExeclCore::RecursionCreateExecl($Head,$data);

推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • vue使用
    关键词: ... [详细]
author-avatar
天使骨头_799
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有