excel导出类

1 篇文章 0 订阅

excel导出类

<?php

namespace common\tools;

use Yii;

//excel处理
class Excel {
    public static $width=15;
    //execl out
    /**
      * templatepath 模版路径
      * m_data页面数据[['row_offset'=>行偏移,'col_offset'=>列偏移,data=>],[],...]  
      * args['outputFileName'=>'输出exce.xlsx文件名','cell_writedate'=>'日期写入那个单元格']
      * $callback 回调函数
      *
    **/
    public static function out($templatepath,$m_data,$args=[],$callback="") {
        set_time_limit(0);
        ini_set('memory_limit', '1024M');
        $cell_writedate=isset($args['cell_writedate'])?$args['cell_writedate']:'C2';
        $outputFileName=isset($args['outputFileName'])?$args['outputFileName']:'temp.xlsx';
        //$filePath = Yii::getAlias('@template').'/team_staff.xlsx';
        $filePath =$templatepath;
        if(!file_exists($filePath)){
            exit('模板文件不存在!');
        }
        $readObj =  \PHPExcel_IOFactory::createReaderForFile($filePath);
        $excelObj = $readObj->load($filePath);
         if($m_data){
            //var_dump($m_data);exit;
            foreach($m_data as $page=>$data_v){//页
                 $downdate=date('Y-m-d H:i:s');
                 $excelObj->setActiveSheetIndex($page-1);
                 $sheet = $excelObj->getActiveSheet();
                 if($cell_writedate) $sheet->setCellValue($cell_writedate,$downdate);
                  $row_offset=isset($data_v['row_offset'])?$data_v['row_offset']:'0';
                  $col_offset=isset($data_v['col_offset'])?$data_v['col_offset']:'0';
                  $startrownum=1+$row_offset;
                  //$startrownum=0;
                  $maxcol=0;
                 foreach($data_v['data'] as $v_key=>$v_v){
                    $row=$v_key+1+$row_offset;
                    //if($v_key==0) $startrownum=$row;
                    foreach($v_v as $v_v_k=>$celldate){
                        //列,行
                        $col=$v_v_k + $col_offset;
                        $maxcol=$maxcol<$col?$col:$maxcol;
                        $sheet->setCellValueByColumnAndRow($col,$row,  $celldate);
                    }
                    
                 }
                 //设置列宽
                 for($nCol = $col_offset; $nCol <= $maxcol; ++ $nCol) {
                   $sheet->getColumnDimensionByColumn ( $nCol )->setAutoSize ( false );
                   $sheet->getColumnDimensionByColumn ( $nCol )->setWidth(self::$width);
                 }

                  //回调函数
                if($callback){
                  $callback($sheet,$row,$startrownum,$args);
                }

            }
          }
         //默认激活0 sheet导出的时候
          $excelObj->setActiveSheetIndex(0);
       // $outputFileName =  'XXXXX_'.date('Y-m-d').'.xlsx';
        $agent = Yii::$app->request->getUserAgent();
        if (stripos($agent, 'windows nt')) {
            $outputFileName = iconv("utf-8", 'gbk', $outputFileName);
        }
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'. $outputFileName .'"');
        header('Cache-Control: max-age=0');
		
        $objWriter = \PHPExcel_IOFactory:: createWriter($excelObj, 'Excel2007');
        $objWriter->save( 'php://output');
        exit;
    }


  // 无模版导出excel
  public static function excel($filename, $datainfo, $name, $format = 0) {
        $phpexcel = new \PHPExcel ();

        $phpexcel->getProperties ()->setCreator ( "www" );
        $phpexcel->getProperties ()->setLastModifiedBy ( "rorot" );
        $phpexcel->getProperties ()->setTitle ( $filename );
        $phpexcel->getProperties ()->setSubject ( $filename );
        $phpexcel->getProperties ()->setDescription ( $filename );
        $phpexcel->getProperties ()->setKeywords ( "office 2007 lenovo openxml php" );
        $phpexcel->getProperties ()->setCategory ( "statistics file" );
      
        foreach($datainfo as $k => $data){
          if($k == 0){
            $phpexcel->setActiveSheetIndex ( $k );
            $phpexcel->getActiveSheet ()->setTitle ( $name[$k] );
          }else{
            //插入第二张工作表
            $msgWorkSheet = new \PHPExcel_Worksheet($phpexcel, $name[$k]); //创建一个工作表
            $phpexcel->addSheet($msgWorkSheet); //插入工作表
            $phpexcel->setActiveSheetIndex($k); //切换到新创建的工作表
          }
          $nRow = 0;
          $nCol = 0;
          $sheet = $phpexcel->getActiveSheet ();

          for($nRow = 0; $nRow < count ( $data ); ++ $nRow) {
            $row = $data [$nRow];
            for($nCol = 0; $nCol < count ( $row ); ++ $nCol) {
              $sheet->setCellValueByColumnAndRow ( $nCol, $nRow + 1, $row [$nCol]);
            }
          }
          for($nCol = 0; $nCol < count ( $data [0] ); ++ $nCol) {
            $sheet->getColumnDimensionByColumn ( $nCol )->setAutoSize ( false );
            $sheet->getColumnDimensionByColumn ( $nCol )->setWidth(self::$width);
          }
        }
        
	  $phpexcel->setActiveSheetIndex(0);
	
	  $outputFileName = $filename . '.xlsx';
        $agent = Yii::$app->request->headers->get('user-agent');
        if (stripos($agent, 'windows nt')) {
          $outputFileName = iconv("utf-8", 'gbk', $outputFileName);
        }
        header ( "Content-Type: application/force-download" );
        header ( "Content-Type: application/octet-stream" );
        header ( "Content-Type: application/download" );
        header ( 'Content-Disposition:inline;filename="' . $outputFileName . '"' );
        header ( "Content-Transfer-Encoding: binary" );
        header ( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
        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" );
        \PHPExcel_IOFactory::createWriter ( $phpexcel, 'Excel2007' )->save ( 'php://output' );
        exit;
  }

  //导出csv
  public static function csv($filename, $data){
      //设置header头
      header('Content-Description: File Transfer');
      header('Content-Type: application/vnd.ms-excel');
      header('Content-Disposition: attachment; filename="' . $filename . '"');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      //打开php数据输入缓冲区
      $fp = fopen('php://output', 'a');
      //如果在csv中输出一个空行,向句柄中写入一个空数组即可实现
      foreach ($data as $row) {
          //将数据编码转换成GBK格式
          mb_convert_variables('GBK', 'UTF-8', $row);
          fputcsv($fp, $row);
          //将已经存储到csv中的变量数据销毁,释放内存
          unset($row);
      }
      //关闭句柄
      fclose($fp);
      exit;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值