PHPExcel 數據導出實例

jopen 9年前發布 | 1K 次閱讀 PHP PHPExcel

一、getdata.php

namespace Webadmin\Model;

use ExtendSpace\Excel;

       ……
       略
       ……
       
       // 取出數據
        $dataBillArr = $this->get_list_bysql($sql);

        // 替換數據中的 0 、1 為 是、否
        // PHPExcel 有內置的方法處理,但是得到的是 TRUE/FALSE,這里自己處理吧
        $this->_formatZero($dataBillArr, array('taxflag', 'payflag', 'removeflag'));

        // 替換支付狀態
        foreach ($dataBillArr as $key => $value) {
            switch ($value['statustype']) {
                case '-1':
                    $dataBillArr[$key]['statustype'] = '已取消';
                    break;
                case '-2':
                    $dataBillArr[$key]['statustype'] = '已取消 已退款';
                    break;
                case '0':
                    $dataBillArr[$key]['statustype'] = '待付款';
                    break;
                case '1':
                    $dataBillArr[$key]['statustype'] = '待發貨';
                    break;
                case '2':
                    $dataBillArr[$key]['statustype'] = '待收貨';
                    break;
                case '3':
                    $dataBillArr[$key]['statustype'] = '已完成';
                    break;
                case '10':
                    $dataBillArr[$key]['statustype'] = '退貨完成';
                    break;
                case '11':
                    $dataBillArr[$key]['statustype'] = '退款完成';
                    break;
                default:
                    $dataBillArr[$key]['statustype'] = '無';
                    break;
            }
        }

        // 設置要導出的字段及對應的表頭名稱
        $header = array(
            array('title'=>'平臺訂單號', 'field'=>'billcode', 'type'=>'string', 'autosize'=>true),
            array('title'=>'用戶帳號', 'field'=>'username', 'type'=>'string', 'autosize'=>true),
            array('title'=>'用戶昵稱', 'field'=>'nickname'),
            array('title'=>'所屬商家', 'field'=>'shopuser', 'autosize'=>true),
            array('title'=>'管易ERP單號', 'field'=>'erpsn', 'type'=>'string', 'autosize'=>true),
            array('title'=>'支付單號', 'field'=>'bspaycode', 'type'=>'string', 'autosize'=>true),
            array('title'=>'保稅批次號', 'field'=>'bsbatchcode', 'type'=>'string', 'autosize'=>true),
            array('title'=>'是否跨境', 'field'=>'taxflag'),
            array('title'=>'訂單狀態', 'field'=>'statustype'),
            ……
            略
            ……
        );

        // 調用接口,執行 Excel 生成及導出操作
        $filename = '訂單流水表_' . date('Y年m月d日_His', time());
        Excel::export($dataBillArr, $header, $filename);


二、Excel.class.php

<?php

namespace ExtendSpace;

/**
 * Class Excel 通用 Excel 接口,處理導出、導出操作
 * 使用說明:
 *     一、導入
 *        待續 。。。
 *     二、導出
 *         use ExtendSpace\Excel;
 *         .....
 *         Excel::export($dataArr, $header, $filename);
 *
 * @package ExtendSpace
 * @author xxxxx 2015-08-27 14:07:14
 * @version
 */
class Excel {

    // private static $objPHPExcel = null;

    /**
     * 入口文件:導出 Excel
     * @return
     */
    public static function export($data, $header, $filename='hms_excel_export') {

        // 引入 PHPExcel 類庫
        import('phpexcel.PHPExcel', dirname(__FILE__) . '/', '.php'); // 這里是 TP 特有,可直接用 include 或 require

        // 初始化設置
        $objPHPExcel = new \PHPExcel();
        $objPHPExcel->getProperties()->setCreator('test')->setLastModifiedBy('test'); // 這里設置中文亂碼,還沒解決
            // ->setTitle('這是標題')
            // ->setSubject('這是什么')
            // ->setDescription('這是描述')
            // ->setKeywords('這是關鍵字')
            // ->setCategory('這是目錄么');
            // var_dump($objPHPExcel->getProperties());exit;

        // 獲取當前要操作的活動工作表
        $objActSheet = $objPHPExcel->getActiveSheet();

        // 寫入表頭
        foreach ($header as $k => $v) {
            $colIndex = self::_getHeaderIndex($k);
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($colIndex . '1', $v['title']);

            // 列是否需要自動適應寬度
            if (!empty($v['autosize'])) {
                $objActSheet->getColumnDimension($colIndex)->setAutoSize(true);
            }
        }

        // 寫入數據,從第二行開始,第一行是表頭
        $rowNum = 2;
        foreach($data as $rows){ // 遍歷數據,獲取一行
            foreach($header as $kk => $vv){ // 單元格寫入
                $colIndex = self::_getHeaderIndex($kk);

                // 是否指定單元格數據格式
                if (!empty($vv['type'])) { // 是
                    switch ($vv['type']) {
                        case 'number':
                            $type = \PHPExcel_Cell_DataType::TYPE_NUMERIC; // 數字
                            break;
                        case 'boolean':
                            $type = \PHPExcel_Cell_DataType::TYPE_BOOL; // 布爾值,0->FALSE;1->TRUE
                            break;
                        default:
                            $type = \PHPExcel_Cell_DataType::TYPE_STRING; // 字符串
                            break;
                    }
                    $objActSheet->setCellValueExplicit($colIndex.$rowNum, $rows[$vv['field']], $type);
                } else { // 否,默認常規
                    $objActSheet->setCellValue($colIndex.$rowNum, $rows[$vv['field']]);
                }
            }
            $rowNum++;
        }

        // 設置行高度 rownum
        // $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(22);

        // 設置字體和樣式
        $objActSheet->getDefaultStyle()->getFont()->setSize(12); // 整體字號
        $objActSheet->getStyle('A1:' . self::_getHeaderIndex(count($header)) . '1')->getFont()->setBold(true); // 列標題加粗

        // 設置工作表名稱
        $objActSheet->setTitle('Sheet1');

        // 設置 header 頭參數
        // 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/octet-stream");
        // header("Content-Type:application/download");;
        // header('Content-Disposition:attachment;filename="' . $savedFileName . '"');
        // header("Content-Transfer-Encoding:binary");

        // 最終輸出
        $savedFileName = self::_iconv($filename) . '.xls'; // 導出文件名+擴展名

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

        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        // $objWriter->save($savedFileName);
    }

    /**
     * 入口文件:導入 Excel
     * @return
     */
    public static function import() {

        // 引入 PHPExcel 類庫
        // import('phpexcel.PHPExcel', dirname(__FILE__) . '/', '.php');

    }

    private static function _init() {

    }

    /**
     * 獲取表頭索引值,即:A,B,C...,大于
     * @param  array $header 用于設置表頭的數組
     * @return string
     */
    private function _getHeaderIndex($num) {
        return \PHPExcel_Cell::stringFromColumnIndex($num);
    }
    
    /**
     * 字符轉換,避免亂碼
     * @param  string $str 待處理的字符
     * @return string
     */
    private function _iconv($str) {
        return iconv('utf-8', 'gb2312', $str);
    }
}



 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!