PHPExcel导入导出

/**
 * 数组转xls格式的excel文件
 * @param  array  $data      需要生成excel文件的数组
 * @param  string $filename  生成的excel文件名
 *      示例数据:
        $data = array(
            array(NULL, 2010, 2011, 2012),
            array('Q1',   12,   15,   21),
            array('Q2',   56,   73,   86),
           );
 */
function hawk_create_xlsx($data,$filename='simple.xlsx'){
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    $filename=str_replace('.xlsx', '', $filename).'.xlsx';
    $phpexcel = new PHPExcel();
    $phpexcel->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");
    $phpexcel->getActiveSheet()->fromArray($data);
    $phpexcel->getActiveSheet()->setTitle('Sheet1');
    $phpexcel->setActiveSheetIndex(0);
    header('Content-Type: application/vnd.ms-excel');
    header("Content-Disposition: attachment;filename=$filename");
    header('Cache-Control: max-age=0');
    header('Cache-Control: max-age=1');
    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($phpexcel, 'Excel5');
    $objwriter->save('php://output');
    exit;
}

/**
 * 数组转xls格式的excel文件(分sheet页---数据量不要超过5万)
 * @param  array  $data      需要生成excel文件的数组
 * @param  int    $listNum   每页行数
 * @param  string $filename  生成的excel文件名 
 */
function hawk_creat_sheet_xlsx($data,$listNum,$filename='simple.xlsx'){
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 
    $cacheSettings = array( 'memoryCacheSize' => '512MB');
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);
    $filename=str_replace('.xlsx', '', $filename).'.xlsx';
    $excel = new PHPExcel();
    //Excel表格列
    $num = count($data[0]);
    if($num<26){
        $letter = array_slice(range('A','Z'),0,$num);  
    }else{
        return json_encode(array('code'=>0,'info'=>' column number is overtop!'));
    }
    //表头
    $tableheader=$data[0];
    //去除数据的表头
    array_shift($data);
    //总得行数
    $count = count($data);
    //每个sheet页最大行数
    if(!$listNum){
        return json_encode(array('code'=>0,'info'=>'$listNum do not null'));
    }  
    $num = ceil($count/$listNum);//sheet页个数  
    $MuitData =  array_chunk($data,$listNum,false);//分割总的数据,每页最多$listNum行有效数据
    //var_dump($MuitData);exit();
    //缺省情况下,PHPExcel会自动创建第一个SHEET,其索引SheetIndex=0  
    //设置 当前处于活动状态的SHEET 为PHPExcel自动创建的第一个SHEET   
    $excel->setActiveSheetIndex(0); //objPHPExcel
    //设置sheet的title  
    $excel->getActiveSheet()->setTitle('数据第'.'1'.'页');
    //设置sheet的列名称  
    for($k = 0; $k < count($tableheader); ++$k) {  
        $excel->getActiveSheet()->setCellValue("$letter[$k]".'1',"$tableheader[$k]");//第一行数据  
    }
    //填充表格信息 处理第1块数据  
    $crrntSheetLineNo = count($MuitData[0]) + 1;  
    for ( $j = 2; $j <= $crrntSheetLineNo; ++$j) { //遍历每一行  
        $k = 0;  
        foreach ( $MuitData[0][$j - 2] as $key => $value ) {//遍历具体行的某一列  
            $excel->getActiveSheet()->setCellValue("$letter[$k]".$j,"$value");//第$k列 第$j行  
            $k++;  
        }  
    }
    //后续的sheet页及数据块  
    for ( $i = 1; $i <$num; ++$i){  
        //创建第$i个sheet  
        $msgWorkSheet = new PHPExcel_Worksheet($excel, '数据第'.($i + 1).'页'); //创建一个工作表  
        $excel->addSheet($msgWorkSheet); //插入工作表  
        $excel->setActiveSheetIndex($i); //切换到新创建的工作表  
  
        //设置sheet的列名称  
        for($k = 0; $k < count($tableheader); ++$k) {  
            $excel->getActiveSheet()->setCellValue("$letter[$k]1","$tableheader[$k]");//第一行数据  
        }
        //填充表格信息 处理第$i块数据  
        $crrntSheetLineNo = count($MuitData[$i]) + 1; //var_dump($crrntSheetLineNo);var_dump($MuitData[$i-1]);die('as');  
        for ( $j = 2; $j <= $crrntSheetLineNo; ++$j) { //遍历每一行  
            $k = 0;  
            //var_dump($MuitData[$i-1][$j - 2]);
            foreach ( $MuitData[$i][$j - 2] as $key => $value ) {//遍历具体行的某一列  
                $excel->getActiveSheet()->setCellValue("$letter[$k]$j","$value");//第$k列 第$j行  
                ++$k;  
            }  
        }  
        usleep(100);
    }
    //创建Excel输出对象    
        
    $write = new PHPExcel_Writer_Excel5($excel);  
    ob_end_clean();//清除缓冲区,避免乱码
    //输出到浏览器  
    header("Pragma: public");  
    header("Expires: 0");  
    header("Cache-Control:must-revalidate, post-check=0, pre-check=0");  
    header("Content-Type:application/force-download");  
    header("Content-Type:application/vnd.ms-execl");  
    header("Content-Type:application/download");               
    header('Content-Type:application/octet-stream');  
    $encoded_filename = urlencode($filename);  
    $encoded_filename = str_replace("+", "%20", $encoded_filename);  
    $ua = $_SERVER["HTTP_USER_AGENT"];    
    if (preg_match("/MSIE/", $ua)) {  
        header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');  
    } else if (preg_match("/Firefox/", $ua)) {  
        header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');  
    } else {  
        header('Content-Disposition: attachment; filename="' . $filename . '"');  
    }   
    header("Content-Transfer-Encoding:binary");       
    $write->save('php://output');
    exit;      
}

/**
 * 数组转csv格式的excel文件(测试20w木有问题)
 * @param  array  $data      需要生成excel文件的数组
 * @param  array  $head      每页行数
 * @param  string $filename  生成的excel文件名 
 */
function hawk_create_csv($data=array()){  
    // 输出Excel文件头,可把user.csv换成你要的文件名   
    header('Content-Type: application/vnd.ms-excel');   
    header('Content-Disposition: attachment;filename="user.csv"');   
    header('Cache-Control: max-age=0');   
    // 打开PHP文件句柄,php://output 表示直接输出到浏览器   
    $fp = fopen('php://output', 'a');   
    // 输出Excel列名信息   
    foreach ($data[0] as $i => $v) {   
        // CSV的Excel支持GBK编码,一定要转换,否则乱码   
        $data[0][$i] = iconv('utf-8', 'gbk', $v);   
    }   
    // 将数据通过fputcsv写到文件句柄   
    fputcsv($fp, $data[0]);  
       
    // 计数器   
    $cnt = 0;   
    // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小   
    $limit = 100000;   
    //去除数据的表头
    array_shift($data);
    // 逐行取出数据,不浪费内存   
    foreach($data as $row) {   
        $cnt ++;   
        if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题   
            ob_flush();   
            flush();   
            $cnt = 0;   
        }   
        foreach ($row as $i => $v) {   
            $row[$i] = iconv('utf-8', 'gbk', $v);   
        }   
        fputcsv($fp, $row);   
    }
}  

/**
 * 导入excel文件
 * @param  string $file excel文件路径
 * @return array        excel文件内容数组
 */
function hawk_import_excel($file){
    // 判断文件是什么格式
    $type = pathinfo($file);
    $type = strtolower($type["extension"]);
    if ($type == 'xlsx') { 
        $type = 'Excel2007'; 
    } elseif ($type == 'xls') { 
        $type = 'Excel5'; 
    } elseif ($type == 'csv') {
        $type = 'csv';
    }
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    // 判断使用哪种格式
    $objReader = PHPExcel_IOFactory::createReader($type);
    $objPHPExcel = $objReader->load($file);
    $sheet = $objPHPExcel->getSheet(0);
    // 取得总行数
    $highestRow = $sheet->getHighestRow();
    // 取得总列数
    $highestColumn = $sheet->getHighestColumn();
    //循环读取excel文件,读取一条,插入一条
    $data=array();
    //从第一行开始读取数据
    for($j=1;$j<=$highestRow;$j++){
        //从A列读取数据
        for($k='A';$k<=$highestColumn;$k++){
            // 读取单元格
            $tmp=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
            //去空值
            if($tmp){
              $data[$j][] = $tmp;
            }
        }
    }
    return $data;
}

 

posted @ 2018-01-10 16:45  lglblog  阅读(200)  评论(0编辑  收藏  举报