您的位置:首页 > 编程语言 > PHP开发

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

2017-06-14 13:19 477 查看
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 "<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++;

        }*/
此处解决列超出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 excel phpexcel
相关文章推荐