phpexcel導入和導出excel文件代碼

PHPExcel代碼地址:https://github.com/PHPOffice/PHPExcel

導入和導出的代碼:(其中vendor是thinkphp中的引入phpexcel包的用法,實際中可以根據具體的框架來)

/**
 * 導入excel文件
 * @param  string $file excel文件路徑
 * @return array        excel文件內容數組
 */
function import_excel($file,$sheet = 0){
    // 判斷文件是什麼格式
    $type = pathinfo($file);
    $type = strtolower($type["extension"]);
    $map = array(
        'xlsx'=>'Excel2007',
        'xls' =>'Excel5',
        'csv' =>'CSV'
    );

    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    setlocale(LC_ALL, 'zh_CN');
    // 判斷使用哪種格式
    $objReader = PHPExcel_IOFactory::createReader($map[$type]);
    $objPHPExcel = $objReader->load($file);
    $sheet = $objPHPExcel->getSheet($sheet);
    // 取得總行數
    $highestRow = $sheet->getHighestRow();
    // 取得總列數
    $highestColumn = $sheet->getHighestColumn();
    //循環讀取excel文件,讀取一條,插入一條
    $data=array();
    //從第一行開始讀取數據
    for($j=1;$j<=$highestRow;$j++){
        //從A列讀取數據
        for($k='A';$k<=$highestColumn;$k++) {
            $cell = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
            if ($cell instanceof PHPExcel_RichText){//富文本轉換字符串
                $cell = $cell->__toString();
            }
            // 讀取單元格
            $data[$j][] = $cell;
        }
    }
    return $data;
}

/**
 *
 * execl數據導出
 * @param string $title 模型名(如Member),用於導出生成文件名的前綴
 * @param array $cellName 表頭及字段名
 * @param array $data 導出的表數據
 * 入參示例
 * $title="這個是測試的標題";
$cellName=[
0=>['id','id',0,12,'CENTER'],
1=>['state','訂單狀態',0,12,'left'],
2=>['type','訂單類型',0,12,'LEFT'],
3=>['price','支付額',0,12,'LEFT'],
4=>['member','會員',0,12,'LEFT'],
5=>['store','店鋪',0,12,'LEFT'],
6=>['order_name','訂單名稱',0,12,'LEFT'],
7=>['num','商品數量',0,12,'LEFT'],
8=>['data','日期',0,12,'LEFT'],
];
$data=[
0=>['id'=>1,'state'=>'代付款','type'=>'普通訂單','price'=>'48.01','member'=>'王大','store'=>'北京','order_name'=>'娃哈哈','num'=>'1523','data'=>'2018-10-09']
];
 *
 * 特殊處理:合併單元格需要先對數據進行處理
 */
function export_excel($title,$cellName,$data,$needHeader=1)
{
    ini_set('max_execution_time', '0');
    //引入核心文件
    vendor("PHPExcel.PHPExcel");
    $objPHPExcel = new \PHPExcel();
    //定義配置
    $topNumber = $needHeader == 1 ? 2 : 1;//表頭有幾行佔用
    $xlsTitle = iconv('utf-8', 'gb2312', $title);//文件名稱
    $fileName = $title.date('_Ymd_His');//文件名稱
    $cellKey = 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()->getDefaultRowDimension()->setRowHeight(20);//所有單元格(行)默認高度
//     $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(20);//所有單元格(列)默認寬度
//     $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);//設置行高度
//     $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(30);//設置列寬度
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(18);//設置文字大小
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);//設置是否加粗
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);// 設置文字顏色
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//設置文字居左(HORIZONTAL_LEFT,默認值)中(HORIZONTAL_CENTER)右(HORIZONTAL_RIGHT)
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//設置填充顏色
//     $objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF7F24');//設置填充顏色

    if ($needHeader == 1){
        //處理表頭標題
        $objPHPExcel->getActiveSheet()->mergeCells('A1:'.$cellKey[count($cellName)-1].'1');//合併單元格(如果要拆分單元格是需要先合併再拆分的,否則程序會報錯)
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1',$title);
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(16);
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
    }
        //處理表頭
    foreach ($cellName as $k=>$v)
    {
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$k].$topNumber, $v[1]);//設置表頭數據
//        $objPHPExcel->getActiveSheet()->freezePane($cellKey[$k].($topNumber+1));//凍結窗口
        $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k].$topNumber)->getFont()->setBold(true);//設置是否加粗
        $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k].$topNumber)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
        if($v[3] > 0)//大於0表示需要設置寬度
        {
            $objPHPExcel->getActiveSheet()->getColumnDimension($cellKey[$k])->setWidth($v[3]);//設置列寬度
        }
    }
    //處理數據
    foreach ($data as $k=>$v)
    {
        foreach ($cellName as $k1=>$v1)
        {
            $objPHPExcel->getActiveSheet()->setCellValue($cellKey[$k1].($k+1+$topNumber), $v[$v1[0]]);
            if($v['end'] > 0)
            {
                if($v1[2] == 1)//這裏表示合併單元格
                {
                    $objPHPExcel->getActiveSheet()->mergeCells($cellKey[$k1].$v['start'].':'.$cellKey[$k1].$v['end']);
                    $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k1].$v['start'])->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                }
            }
            if($v1[4] != "" && in_array($v1[4], array("LEFT","CENTER","RIGHT")))
            {
                $v1[4] = eval('return PHPExcel_Style_Alignment::HORIZONTAL_'.$v1[4].';');
                //這裏也可以直接傳常量定義的值,即left,center,right;小寫的strtolower
                $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k1].($k+1+$topNumber))->getAlignment()->setHorizontal($v1[4]);
            }
        }
    }
    //導出execl
    header('pragma:public');
    header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xlsx"');
    header("Content-Disposition:attachment;filename=$fileName.xlsx");//attachment新窗口打印inline本窗口打印
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');
    exit;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章