PHPExcel實現導入導出功能


之前做應用后台的時候,都是用的現有后台框架的導入導出功能,這次由於需要對導出的Excel做特殊的要求,所以研究了下PHPExcel,並整理了一下,結合網上的例子和官方文檔整理了導入、導出的方法,並對常用的樣式做了一份總結。

下載好PHPExcel解壓后:
img
Documentation/PHPExcel Function Reference developer documentation.docPHPExcel詳細的文檔,如果有什么特定的樣式需求都可以在上面找到。將Classes目錄下文件拖入項目即可。

導入功能

function importExcel($filename = ''){
    $filename = iconv('utf-8', 'gb2312', $filename);

    if (empty($filename) || !file_exists($filename)){
        die('file not exists');
    }

    // 兼容 Excel03 和 Excel07
    $objRead = new PHPExcel_Reader_Excel2007();
    if (!$objRead->canRead($filename)){
        $objRead = new PHPExcel_Reader_Excel5();
        if (!$objRead->canRead($filename)){
            die('No Excel');
        }
    }

    // 獲取 excel 中的文件內容
    $objPHPExcel = PHPExcel_IOFactory::load($filename);

    // 一次性取出整個 sheet 內的內容(不常用)
//    $sheetCount = $objPHPExcel->getSheetCount();
//    for ($i=0; $i<$sheetCount; $i++){
//        $data = $objPHPExcel->getSheet($i)->toArray();
//        var_dump($data);
//    }

    // 逐行讀取 sheet 內的內容(常用)
    foreach ($objPHPExcel->getWorksheetIterator() as $sheet){   //循環sheet
        foreach ($sheet->getRowIterator() as $row){     //循環row
            if ($row->getRowIndex() == 1){  // 默認從第二行開始
                continue;
            }

            foreach ($row->getCellIterator() as $cell){     //循環cell
                $data = $cell->getValue();
                echo $data;
            }
        }
    }
}

導出功能

function exportExcel($filename = '', $type = 'Excel5'){
    $phpExcel = new PHPExcel();

    // 獲取當前活動sheet操作對象
    $activeSheet = $phpExcel->getActiveSheet();

    // 設置sheet標題
    $activeSheet->setTitle('測試');

    // Excel文件中,橫坐標依次是: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');
    // 縱坐標是:1, 2, 3, 4, 5, 6, 7, 8...
    // 所以如果具體設置某個行列的值時:A8、B9這種

    // 填充數據
    $activeSheet->setCellValue('A1', '姓名')
        ->setCellValue('B1', '性別');
    $activeSheet->setCellValue('A2', '張三')
        ->setCellValue('B2', '男');
    $activeSheet->setCellValue('A3', '小紅')
        ->setCellValue('B3', '女');

    // 根據數組創建activeSheet,可以不用setCellValue()
    //$dataArr = array(
    //    [
    //
    //    ]
    //);
    //$activeSheet->fromArray();
    
    // 生成excel文件
    $objWriter = PHPExcel_IOFactory::createWriter($phpExcel, $type);
    //$objWriter->save('list.xls'); //保存到本地

    if ($type == 'Excel5'){
        // 輸出excel03文件
        header('Content-Type: application/vnd.ms-excel');
    }else{
        // 輸出excel07文件
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    }

    header('Content-Disposition: attachment;filename="'.$filename.'"'); //
    header('Cache-Control: max-age=0'); // 禁止緩存

    // "php://output":只寫數據流, 允許你以 print 和echo一樣的方式寫入到輸出緩沖區
    $objWriter->save("php://output");
}

樣式設置

$dirname = dirname(__FILE__);
require $dirname.'/PHPExcel/PHPExcel.php';

$projects = array (
    array(
        array ( 'username' => '巫敏華', 'mobile' => '13580522501' ),
        array ( 'username' => '黃宙洪', 'mobile' => '15011700233' ),
        array ( 'username' => '譚沙', 'mobile' => '13929540712' ),
        array ( 'username' => '測試01', 'mobile' => '13000000000' ),
        array ( 'username' => '方總', 'mobile' => '13719188314' ),
        array ( 'username' => '王開盤', 'mobile' => '13632125376' ),
        array ( 'username' => '和平', 'mobile' => '13710283761' ),
    ),
    array(
        array ( 'username' => '巫敏華', 'mobile' => '13580522501', ),
        array ( 'username' => '黃宙洪', 'mobile' => '15011700233', ),
        array ( 'username' => '王模擬', 'mobile' => '13632125376', ),
        array ( 'username' => '和平', 'mobile' => '13710283761', ),
    ),
);

// 創建PHPExcel對象
$objPHPExcel = new PHPExcel();

// 獲取活動狀態的sheet
$objSheet = $objPHPExcel->getActiveSheet();

// 合並cell
$objSheet->mergeCells('A1:D1');

// 設置
$objSheet->setCellValue('A1', '用戶信息表');

//設置背景顏色、邊框顏色
$objSheet->getStyle('A1:D1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('00FF00');
$objSheet->getStyle('A1:D1')->applyFromArray(getBorderStyle('0099FF'));

// 設置表格內 文字水平居中、垂直居中
$objSheet->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objSheet->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

foreach ($projects as $k=>$project){
    $row = 2; // 從第二行開始循環

    $nameIdx = getCellIdx($k * 2);
    $mobileIdx = getCellIdx($k *2 + 1);

    // 設置 項目標題
    $objSheet->getStyle($nameIdx)->getAlignment()->setWrapText(true);  //設置換行,需要寫在設置cell的值之前
    $objSheet->setCellValue($nameIdx.$row, '項目'.($k+1)."\n你好");  // 轉義字符都需要用雙引號包含起來


    // 合並單元格
    // $objPHPExcel->getActiveSheet()->mergeCells('A18:E22');
    $startIdx = $nameIdx.$row;
    $endIdx = $mobileIdx.$row;
    $objSheet->mergeCells("{$startIdx}:{$endIdx}");

    $objSheet->getStyle("{$startIdx}:{$endIdx}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('448CBB');

    $objSheet->getStyle("{$startIdx}:{$endIdx}")->applyFromArray(getBorderStyle('808080'));
    

    foreach ($project as $index=>$user) {
        $row++;
        // 設置用戶
//        $objSheet->setCellValue($nameIdx . $row, $user['username'])->setCellValue($mobileIdx . $row, $user['mobile']);
        $mobile = 123456789098765432123456789;
        $objSheet->setCellValue($nameIdx . $row, $user['username'])->setCellValue($mobileIdx . $row, $mobile."\t");

//        $objSheet->setCellValueExplicit($mobileIdx . $row, 123456789098765432123456789, PHPExcel_Cell_DataType::TYPE_STRING);

//        $objSheet->getStyle($mobileIdx)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);


        //pValue 數字過長,如果是文本則顯示全,如果是數字則顯示不全,可以在文本后面加上"\t"來實現

        $objSheet->getStyle($nameIdx . $row)->applyFromArray(getBorderStyle('808080'));
        $objSheet->getStyle($mobileIdx . $row)->applyFromArray(getBorderStyle('808080'));

    }
}

// 設置文字粗細
$objSheet->getStyle('A1:Z1')->getFont()->setSize(20)->setBold(true);
$objSheet->getStyle('A2:Z2')->getFont()->setSize(15)->setBold(true);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$filename = '用戶.xls';

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'"'); //
header('Cache-Control: max-age=0'); // 禁止緩存

$objWriter->save("php://output");

function getCellIdx($key){
    $header_arr = range('A', 'Z');
    return $header_arr[$key];
}

function getBorderStyle($color){
    return array(
        'borders' => array(
            'outline' => array(
                'style' => PHPExcel_Style_Border::BORDER_THICK,
                'color' => array('rgb' => $color),
            ),
        ),
    );
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM