ThinkPHP5整合PHPExcel导出2——一个Excel多个工作表

遇到个内部需求 “财务人员需要导出订单数据,必须包含两个工作表在一个Excel里面”,业务需求不得不做,一顿操作猛如虎之后总结方法如下,前面部分和《TinkPHP5整合PHPExcel导出》的方法一样,只是写了个可扩展工作表的类

1、安装PHPExcel到thinkphp5
直接使用composer require phpoffice/phpexcel 命令即可自动下载到框架目录vendor下,如果不会使用可直接下载好PHPExcel插件文件夹手动放入vendor\phpoffice\下
2、使用
1)这里我写了一个扩展类到框架扩展文件夹extend\org下 类文件如下

<?php
namespace org;
use PHPExcel_Cell_DataType;
use PHPExcel_IOFactory;
use PHPExcel;
use PHPExcel_Style_Fill;
use PHPExcel_Style_Border;
use PHPExcel_Style_NumberFormat;

class ExcelWorksheets{
    private $PHPExcel;
    private $PHPSheet;
    private $PHPWriter;
    private $title;
    private $rows;
    private $menus;

    private $sysmenu = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    /**
     * 架构方法 设置参数
     */
    public function __construct()
    {
        // 创建Excel设置第一个工作表为操作表
        $this->PHPExcel  = new PHPExcel();
        $this->PHPExcel->setActiveSheetIndex(0);
        $this->PHPSheet  = $this->PHPExcel->getActiveSheet();
        $this->PHPWriter = PHPExcel_IOFactory::createWriter($this->PHPExcel,'Excel2007');
    }
    // 开始下载表格
    public function downExcel($title,$rows,$menus)
    {
        // 工作表信息
        $this->title = $title;
        $this->rows  = $rows;
        $this->menus = $menus;
        // 判断有多少个工作表
        for ($i=0;$i<count($title);$i++){

            if($i>0){
                $msgWorkSheet = new \PHPExcel_Worksheet($this->PHPExcel, $this->title[$i]); //创建一个工作表
                $this->PHPExcel->addSheet($msgWorkSheet); //插入工作表
                $this->PHPExcel->setActiveSheetIndex($i); //切换到新创建的工作表
                $this->PHPSheet  = $this->PHPExcel->getActiveSheet();
            }

            $this->PHPSheet->setTitle($this->title[$i]);

            $this->setMenu($i);

            $this->setContents($i);

        }
        $this->PHPExcel->setActiveSheetIndex(0); //切换到新创建的工作表

        $filename = "订单数据导出".date("YmdHis",time()).".xlsx";
        ob_end_clean();
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename="'.$filename.'"');
        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");
        $this->PHPWriter->save('php://output');
    }
    /**
     * 设置标题栏
     */
    private function setMenu($index)
    {
        $max = count($this->menus[$index]);

        for ($im=0; $im < $max; $im++) {
            $this->PHPSheet->setCellValue($this->sysmenu[$im]."1",$this->menus[$index][$im]);
            $this->PHPSheet->getColumnDimension($this->sysmenu[$im])->setAutoSize(true);
        }
        $this->PHPSheet->getStyle('a1:'.$this->sysmenu[$max-1]."1")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
        $this->PHPSheet->getStyle('a1:'.$this->sysmenu[$max-1]."1")->getFill()->getStartColor()->setARGB('FF0070C0');
        $this->PHPSheet->getStyle('a1:'.$this->sysmenu[$max-1]."1")->getFont()->getColor()->setARGB('FFFFFFFF');
    }
    /**
     * 设置内容显示
     */
    private function setContents($index)
    {
        $r = 2;
        $insertdata = $this->rows[$index];
//        print_r($insertdata);
        foreach ($insertdata as $k => $v) {
            $this->setRowsContent($r,$v);
            $r++;

        }
    }
    /**
     * 设置每行数据
     */
    private function setRowsContent($rownum,$data)
    {
//        print_r($data);
        $styleThinBlackBorderOutline = array(
            'borders' => array (
                'outline' => array (
                    'style' => PHPExcel_Style_Border::BORDER_THIN,   //设置border样式
                    //'style' => PHPExcel_Style_Border::BORDER_THICK,  另一种样式
                    'color' => array ('argb' => 'FF000000'),          //设置border颜色
                ),
            ),
        );
//        $keyarr = array_keys($data);

        for ($ri=0; $ri < count($data); $ri++) {
            $keyarr = array_keys($data);
            $keyvalue = $keyarr[$ri];
            $this->PHPSheet->setCellValue($this->sysmenu[$ri].$rownum,$data[$keyvalue]);
            $this->PHPSheet->getStyle($this->sysmenu[$ri].$rownum)->applyFromArray($styleThinBlackBorderOutline);
            $this->PHPSheet->getColumnDimension($this->sysmenu[$ri])->setAutoSize(true);
            $this->PHPSheet->getStyle($ri)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);

        }

    }
}

2)用法
控制器文件引入扩展use org\ExcelWorksheets;
① 获取数据库数据
② 实例化下载类
③ 传入文件名、结果集、菜单数组
通过以上三步即可开始下载excel文件

  public function index()
  {
          $rows = db("projects_animals")->where('isdel',0)->select();
          $order = new orderlogic();
          $rows = $order->outOrderExcel($ordernumber, $expnumber, $isspilt, $state, $paytype, $seallername,$sname,$getperson,$starttime, $endtime);// 获取结果集
          $exc = new ExcelWorksheets();// 实例化导出对象
          $title = array("订单","货品"); // 工作表数组,有多少个工作表传多少数据
          $menus = array(
              array("id","宠物医院","销售","价格","是否拆单","订单编号","支付类型","状态","生成时间"),
              array("订单编号","编号","品名","规格","单位","数量","赠送","单价","合计")
          ); // 按工作表顺序传入第一行标题数据

          $datas = array(
              $rows["data"], // 订单数据
              $rows["detail"]// 详情数据
          );// 这里根据自己需求传入对应数量的数组,我这里是两个工作表 所以传入的数组长度是2
          $exc->downExcel($title,$datas,$menus);// 开始导出
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342