phpexcel导入导出excel,并解决超出26列出现的错误

 
  
Thinkphp  
$lists = '';             //sql查询结果;
  $total_money = '';
  $filename="order_excel"; // 文件名称
  $headArr=array("ID","用户名称","专家名称","专家订单","订单价格","消费类型","订单类型","订单时间","订单有效期");      
  $title = "订单明细";     //  文件标题
  $total_name = '总金额';
  $this->exportExcel($filename,$title,$headArr,$order_listss,$total_name,$total_money);
第一种:
function exportExcel($filename,$expTitle,$expCellName,$expTableData,$total_name='',$total_money='')
{
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称
        $fileName = $filename.date('_YmdHis');//or $xlsTitle 文件名称可根据自己情况设定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);

        Vendor("PHPExcel.PHPExcel");
        Vendor("PHPExcel.PHPExcel.Writer.Excel5");
        Vendor("PHPExcel.PHPExcel.PHPExcel.IOFactory.php");
        $objPHPExcel = new \PHPExcel();
        $cellName = array('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','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
        
        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));  
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]); 
        } 
        $column = 3;
        $objActSheet = $objPHPExcel->getActiveSheet(0);
        foreach($expTableData as $keys => $rows){ 
            $span = ord("A");
            foreach($rows as $keyName=>$value){
                $j = chr($span);
                $objActSheet->setCellValue($j.$column, $value);
                $span++;
            }
            $column++;
        }
        if (!empty($total_money) && !empty($total_name))
        {
            $objActSheet->setCellValue('A'.$column, $total_name);
            $objActSheet->setCellValue('B'.$column, $total_money[0]['total_money']);
        }        
        
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');  
        $objWriter->save('php://output'); 
        exit;   
}
 
  
第二种:
/**
 * excel表格导出
 * @param string $fileName 文件名称
 * @param array $expTitle 表头名称
 * @param array $expTableData 要导出的数据
 * @author static7  */
function exportExcel($filename,$expTitle,$expCellName,$expTableData)
{
//    $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称
//    $fileName = $expTitle;//or $xlsTitle 文件名称可根据自己情况设定
    $cellNum = count($expCellName);
    $dataNum = count($expTableData);
    vendor("PHPExcel");
    $objPHPExcel = new PHPExcel();
    // Set document properties
    $objPHPExcel->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");
        ob_clean();    //解决文件损坏
// Add some data
        $cellName = array('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','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
        
    // $nowDate = date('Y-m-d H:i', time());
    $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');    //合并单元格
    $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  导出时间:'.date('Y-m-d H:i:s')); 
    for($i=0;$i<$cellNum;$i++){
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]); 
    }
    $column = 3;
    $objActSheet = $objPHPExcel->getActiveSheet(0);
    foreach($expTableData as $keys => $rows){  // 行写入
            $span = ord("A");
            foreach($rows as $keyName => $value){    // 列写入
                $j = chr($span);
                $objActSheet->setCellValue($j.$column, $value);
                $span++;
            }
            $column++;
        }
    // Rename worksheet 重命名工作表,修改sheet名称
    $objPHPExcel->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
    $objPHPExcel->setActiveSheetIndex(0);    // 设置活动单指数到第一个表,所以Excel打开这是第一个表
// Redirect output to a client’s web browser (Excel2007)
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header("Content-Disposition: attachment;filename=$filename.xlsx");
    header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
    header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
    header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
    header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header ('Pragma: public'); // HTTP/1.0
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');
    exit;
}








YII

一 :导入excel文件

引入phpexcel类库

require(Yii::getAlias('@common').'/library/PHPExcel/PHPExcel.PHP'); //这是yii的引入方式 根据情况自己引入类库

1.要上传文件

if (!empty ( $_FILES ['excel'] ['name'] )){
    $tmp_file = $_FILES ['excel'] ['tmp_name'];
     $file_types = explode ( ".", $_FILES ['excel'] ['name'] );
    $file_type = end($file_types);

  /*判别是不是.xls文件,判别是不是excel文件*/
  if ((strtolower ($file_type) != "xls")  && (strtolower ($file_type) != "xlsx")&& (strtolower ($file_type) != "csv")){
      $error ="文件类型不对";
     die;
  }

//DS 是自己定义的/ 和在Linux里是\   需要自己定义

  $dir=date("Y-m-d",time());
  if(!is_dir(ROOT_PATH.DS."upload".DS."excel".DS.$dir)){
  
    mkdir(ROOT_PATH.DS."upload".DS."excel".DS.$dir);
  }
  //注意,如果upload前加 / 则报错。
  $path = 'upload'.DS.'excel'.DS.$dir.DS. time().rand(1000,9999) . '.' . $file_type;


  $pic_name = time() . rand(10000, 99999) . "." . $file_type;//图片名称

if (!move_uploaded_file($tmp_file, $path)) { //临时文件转移到目标文件夹
    $error ="上传失败";
     return $this->redirect(['index', 
                'error' => $error,
            ]);
     die;
}

2.读取上传的文件

  //加载导入类
  $PHPExcel=new \PHPExcel();

  $PHPReader = new \PHPExcel_Reader_Excel2007();
  if(!$PHPReader->canRead($path)){
    $PHPReader = new \PHPExcel_Reader_Excel5();
    if(!$PHPReader->canRead($path)){
       return false;
     }
  }
  $PHPExcel=$PHPReader->load($path);//载入文件
  // print_r($PHPExcel);die;
  $currentSheet=$PHPExcel->getSheet(0); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
  $allColumn=$currentSheet->getHighestColumn();//获取总列数d
++$allColumn;
  $allRow=$currentSheet->getHighestRow();//获取总行数
  

// echo $allRow;die;
  // print_r($allRow);die;
  $arr=array();
  for($currentRow = 3;$currentRow <= $allRow;$currentRow++){
      /**从第A列开始输出*/
      $i=0;
      for($currentColumn = 'A'; $currentColumn !=$allColumn; $currentColumn++){ //大于26列
         if($i>25){
          $num =ord($currentColumn)+$i;
         }else{
            $num =ord($currentColumn);
         }
        // echo $i.$currentColumn; echo "
";

        $val = $currentSheet->getCellByColumnAndRow($num - 65,$currentRow)->getValue(); /*ord()将字符转为十进制数*/
        
         
          /**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/
          // $arr[$currentRow][]=  iconv('utf-8','gb2312', $val)."\t";
          $arr[$currentRow][]=  trim($val);
          $i++;
      }
  }
  //删除全部为空的行
  foreach ($arr as $key=>$vals){
      $tmp = '';
      foreach($vals as $v){
          $tmp .= $v;
      }
      if(!$tmp) unset($arr[$key]);
  }
       print_r($arr);die;


二:导出excel

public function getExcel($fileName,$headArr,$data){

//$headArr, 设置的表头

//$data 传过来的需要导出的数据 二维数组

        $date = date("Y_m_d",time());
        $fileName .= "_{$date}.xls";

        //创建PHPExcel对象,注意,不能少了\
        $objPHPExcel = new \PHPExcel();
        $objProps = $objPHPExcel->getProperties();

        //设置表头 超过26列
        $key = 0;
        foreach($headArr as $v){
            //注意,不能少了。将列数字转换为字母\
            $colum = \PHPExcel_Cell::stringFromColumnIndex($key);
            $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
            $key += 1;
        }

        //设置表头
       /* $key = ord("A");
        //print_r($headArr);exit;
        foreach($headArr as $v){
            $colum = chr($key);
            $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
            $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
            $key += 1;
        }*/
        $column = 2; //从第二行写入数据 第一行是表头
        $objActSheet = $objPHPExcel->getActiveSheet();
        //print_r($data);exit;
        /*foreach($data as $key => $rows){ //行写入
            $span = ord("A");
            foreach($rows as $keyName=>$value){// 列写入
                $j = chr($span);
                $objActSheet->setCellValue($j.$column, $value);
                $span++;
            }
            $column++;
        }*/

此处解决列超出26的问题
        foreach($data as $key => $rows){ //行写入
            $span = 0;
            foreach($rows as $keyName=>$value){// 列写入
                $j = \PHPExcel_Cell::stringFromColumnIndex($span);
                $objActSheet->setCellValue($j.$column, $value);
                $span++;
            }
            $column++;
        }

        $fileName = iconv("utf-8", "gb2312", $fileName);

       /*  //重命名表
        $objPHPExcel->getActiveSheet()->setTitle($date);
        //设置字体大小
        $objPHPExcel->getDefaultStyle()->getFont()->setSize(14);
        //设置单元格宽度
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
        //设置默认行高
        $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(23);
*/
        
        //重命名表
        //$objPHPExcel->getActiveSheet()->setTitle('test');
        //设置活动单指数到第一个表,所以Excel打开这是第一个表
        $objPHPExcel->setActiveSheetIndex(0);
        ob_end_clean();//清除缓冲区,避免乱码
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=\"$fileName\"");
        header('Cache-Control: max-age=0');
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output'); //文件通过浏览器下载
        exit;

你可能感兴趣的:(php)