PHPexcel导入导出超过26列的解决方法

一 :导入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 "<br>";

        $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++;
        }*/
        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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值