博客列表 >PhpExcel的使用

PhpExcel的使用

kyle
kyle原创
2018年08月08日 21:15:391196浏览

参考地址:http://www.thinkphp.cn/topic/53674.html。

项目引入PhpExcel类库

 /**
     * 导出网站
     * @author Manage<admin@jifenbang.net>
     * @param array $sites
     */
    protected function _export_site($sites){
//        vendor("common.Org.PHPExcel");
        $filename = get_config('name').'网站导出.'.date("Ymd");
        Loader::autoload('./PHPExcel/PHPExcel');
        $objPHPExcel = new \PHPExcel();
        $objPHPExcel->getProperties()->setCreator(get_config('name'))
                    ->setLastModifiedBy(get_config('name'))
                    ->setTitle(get_config('name')."买卖链网站EXCEL导出")
                    ->setSubject(get_config('name')."网站EXCEL导出")
                    ->setDescription(get_config('name')."网站数据")
                    ->setKeywords("excel")
                    ->setCategory("result file");
        // 第一行标题
        $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue('A1', '网站名称')
                    ->setCellValue('B1', '网站域名')
                    ->setCellValue('C1', '网站分类')
                    ->setCellValue('D1', '价格/月')
                    ->setCellValue('E1', '百度BR')
                    ->setCellValue('F1', '百度收录')
                    ->setCellValue('G1', '谷歌PR');
        // 设置列宽
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
        // 设置标题加粗
        $objPHPExcel->getActiveSheet()->getStyle('A1:G1')->getFont()->setBold(true);
        // 设置yanse
        $objPHPExcel->getActiveSheet()->getStyle('A1:D1')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED);
        $objPHPExcel->getActiveSheet()->getStyle('D1:D2001')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED);
        $objPHPExcel->getActiveSheet()->getStyle('E1:G1')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_BLUE);
        // 循环设置数据
        foreach($sites as $k => $v){
            $k += 2;
            $objPHPExcel->setActiveSheetIndex(0)
                        ->setCellValue('A'.$k, $v['site_name'])
                        ->setCellValue('B'.$k, $v['site_domain'])
                        ->setCellValue('C'.$k, $v['cate']['name'])
                        ->setCellValue('D'.$k, (request()->module()=='Base' ? $v['price'] : $v['price_member']))
                        ->setCellValue('E'.$k, $v['stat']['br_tools'])
                        ->setCellValue('F'.$k, $v['stat']['b_num'])
                        ->setCellValue('G'.$k, $v['stat']['pr']);
        }
        $objPHPExcel->getActiveSheet()->setTitle('网站列表');
        $objPHPExcel->setActiveSheetIndex(0);
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
        header('Cache-Control: max-age=0');
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }
    /*---------------------------------分割线 --------------------------------------------*/
   /**
   * 读取Excel文件到数组、导入
   * @author Base<admin@jifenbang.net>
   * @param 文件路径 $file
   * @param 开始行 $start_row
   */
  protected function _read_excel($file , $start_row=1)
  {
        Loader::autoload('./PHPExcel/PHPExcel');
        if(!file_exists($file)){
           return false;
        }
        $reader = \PHPExcel_IOFactory::createReader('Excel2007');
        if(!$reader->canRead($file)){
           $reader = \PHPExcel_IOFactory::createReader('Excel5');
           if(!$reader->canRead($file)){
              return false;
           }
        }
        // 载入excel文件
        $PHPExcel = $reader->load($file);
        // 读取第一個工作表
        $sheet = $PHPExcel->getSheet(0);
        // 取得总行数
        $highestRow = $sheet->getHighestRow();
        // 取得总列数
        $highestColumm = $sheet->getHighestColumn();
        // 字母列转换为数字列 如:AA变为27
        $highestColumm= \PHPExcel_Cell::columnIndexFromString($highestColumm);
        //$columnName = \PHPExcel_Cell::stringFromColumnIndex($column);
        $list = array();
        // 行数是以第1行开始
        for ($row = $start_row; $row <= $highestRow; $row++){
           // 列数是以第0列开始
            for ($column = 0; $column < $highestColumm; $column++) {
       $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
       // 第一列不为空即可
       if($column < 1 && $val=="") continue;
              $list[$row][] = $val;
            }
        }
        return $list;
  }
  /*---------------------------------分割线 --------------------------------------------*/
  //形式二:
  //导出excel
public function exportExcel($list)
{
    //查询数据

    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel.php';
    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/IOFactory.php';
    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/IWriter.php';
    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/Excel5.php';
    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/Excel2007.php';
    include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Cell/DataType.php';

    $objPHPExcel = new \PHPExcel();
    //设置表头信息
    $row = 1;
    $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A'.$row, 'ID')
        ->setCellValue('B'.$row, '用户')
        ->setCellValue('C'.$row, '商品')
        ->setCellValue('D'.$row, '支付通道')
        ->setCellValue('E'.$row, '金额(元)')
        ->setCellValue('F'.$row, '日期')
        ->setCellValue('G'.$row, '状态');

    /*--------------开始从数据库提取信息插入Excel表中------------------*/

    $row = 2;  //定义一个row变量,目的是在循环输出数据是控制行数
    //$count = count($sql);  //计算有多少条数据
    $activeSheet = $objPHPExcel->getActiveSheet();
    foreach ($list as $order) {
        $activeSheet->setCellValue('A' . $row, $order['id'])
            ->setCellValue('B' . $row, $order->user->email)
            ->setCellValue('C' . $row, $order->product->title)
            ->setCellValue('D' . $row, $order->type_text)
            ->setCellValue('E' . $row, $order->pay_fee/100)
            ->setCellValue('F' . $row, $order->create_time)
            ->setCellValue('G' . $row, $order->status_text);

        $row++;
    }


    /*--------------下面是设置其他信息------------------*/

    $objPHPExcel->getActiveSheet()->setTitle('导出');      //设置sheet的名称
    $objPHPExcel->setActiveSheetIndex(0); //设置sheet的起始位置
    //$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');   //通过PHPExcel_IOFactory的写函数将上面数据写出来

    $PHPWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel, "Excel2007");

    header('Cache-Control: max-age=0');//禁止缓存
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器输出07Excel文件
    //header('Content-Type:application/vnd.ms-excel');//告诉浏览器将要输出Excel03版本文件
    $fileName = 'orders_' . date_time(time(), 'Y-m-d-Hi') . '.xlsx';
    header("Content-Disposition: attachment;filename=\"$fileName\"");//告诉浏览器输出浏览器名称


    $PHPWriter->save("php://output"); //表示在$path路径下面生成demo.xlsx文件
}

上述两种方法局限性大,只能服务于一种表的数据导出,只适用列数固定

Excel导入程序流程: Excel上传 -> excel读取类读取数据 -> 生成格式化数据 ->sql写入数据库

导出方式:1、下载流 savePath = 'php://output' ; 2、文件流 :保存到指定目录下

/**
     * 导出excel
     * @param $titleArr 表头数组
     * @param $dataArr 数据数组
     * @param array $dataMetaArr 数据元数组,下标数组
     * @param string $savePath 保存路径
     * @param string $writerType 保存格式
     * @return string
     * @throws \Exception
     */
    public function exportExcel($titleArr, $dataArr, $dataMetaArr=[], $savePath='php://output', $writerType='xlsx')
    {
        if (!is_array($titleArr) || !is_array($dataArr)) {
             return '表格表头和数据须为数组!';
        }
        $dataColumnLen = $this->column_len($dataArr);
        if (count($titleArr) != $dataColumnLen) {
            return '表格表头和数据数组长度不一致!';
        }

        if (empty($dataMetaArr)) {
            $dataMetaArr = range(0,count($titleArr) - 1,1);
//            dump([$dataMetaArr]);
        }

        if (!in_array($writerType, ['xlsx', 'xls'])) {
            $writerType = 'xlsx';
        }

        //查询数据
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel.php';
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/IOFactory.php';
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/IWriter.php';
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/Excel5.php';
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Writer/Excel2007.php';
        include Env::get('root_path') . 'extend/' . 'PHPExcel/PHPExcel/Cell/DataType.php';

        $objPHPExcel = new \PHPExcel();
        $objPHPExcel->setActiveSheetIndex(0);//设置当前sheet为第一个

        /*--------------表头信息插入Excel表中------------------*/
        $row = 1; //表行变量
        $activeSheet = $objPHPExcel->getActiveSheet();
        for ($i = 0; $i < count($titleArr); $i++) {
            $col = chr(ord('A') + $i);
            $activeSheet->setCellValue($col.$row, $titleArr[$i]);
        }

        /*--------------数据信息插入Excel表中------------------*/
        $row = 2;  //定义一个row变量
        foreach ($dataArr as $data) {
            for ($i = 0; $i < count($dataMetaArr); $i++) {
                $col = chr(ord('A') + $i);
                //$activeSheet->setCellValue($col . $row, $data[$dataMetaArr[$i]]);
                $activeSheet->setCellValueExplicit($col . $row, $data[$dataMetaArr[$i]], \PHPExcel_Cell_DataType::TYPE_STRING);
//             dump($data[$dataMetaArr[$i]]);
            }
            $row++;
        }
//        die();

        $objPHPExcel->getActiveSheet()->setTitle('导出');      //设置sheet的名称
        $objPHPExcel->setActiveSheetIndex(0); //设置sheet的起始位置
        if ($writerType == 'xls') {
            $PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');   //通过PHPExcel_IOFactory的写函数将上面数据写出来
        } else {
            $PHPWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel, "Excel2007");
        }

        //输出路径
        if (strtolower($savePath) == 'php://output') {
            if ($writerType == 'xls') {
                header('Content-Type:application/vnd.ms-excel');//告诉浏览器将要输出Excel03版本文件
            } else {
                header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器输出07Excel文件
            }
            header('Cache-Control: max-age=0');//禁止缓存
            $fileName = 'excel_' . date_time(time(), 'Y-m-d-Hi') . '.' . $writerType;
            header("Content-Disposition: attachment;filename=\"$fileName\"");//告诉浏览器输出浏览器名称

            $PHPWriter->save("php://output"); //表示输出到下载流
        } else {
            $fileName = 'excel_' . date_time(time(), 'Y-m-d-Hi') . '.' . $writerType;
            $PHPWriter->save($savePath . DIRECTORY_SEPARATOR . $fileName); //表示在$path路径下面生成demo.xlsx文件
        }
    }


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议