基於PHPExcel庫的EXCEL匯入匯出

來源:互聯網
上載者:User
PHPExcel類是php一個excel表格處理外掛程式,最近由於工作需要用到了這個外掛程式,完成了一個excel匯入匯入的功能。現在將主要邏輯整理一下和大家分享,有需要的可以參考一下。

下面的案例只是完成了一個excel的上傳下載的準系統,還有一些設定表格樣式、合併儲存格等操作沒有體現在這裡,大家可以參考PHPExcel的手冊,案例後面是我摘出來的PHPExcel的常見的一些操作,供大家參考:

將PHPExcel提供的API根據需要封裝成一個供上傳和下載使用的類,其實就是兩個函數,一個用於上傳一個用於下載,這裡我就直接將代碼貼出來了。

canRead($file))        {            /* 如果PHPExcel_Reader_Excel2007無法讀取excel,則銷毀剛才建立的對象,使用PHPExcel_Reader_Excel5來讀 */            unset($phpReader);            $phpReader = new PHPExcel_Reader_Excel5();        }                if(!$phpReader->canRead($file))        {            /* 檔案無法讀取,返回空的數組 */            return array();        }                $phpExcel     = $phpReader->load($file);                /* 目前的實現唯讀取第一個工作表 */        $currentSheet = $phpExcel->getSheet(0);        /* 拿到工作表的行數和列數 */        $allRows      = $currentSheet->getHighestRow();         $allColumns   = $currentSheet->getHighestColumn();         $allColumns++;        $currentColumn = 'A';                /* 解析第一個行,記錄$fields中要讀取的行 */        while($currentColumn != $allColumns)        {            $title = $currentSheet->getCell($currentColumn . '1')->getValue();            $field = array_search($title, $fields);            $columnKey[$currentColumn] = $field ? $field : '';            $currentColumn++;        }                $dataList = array();                /* 跳過標題列(第一行)開始讀取資料 */        for($currentRow = 2; $currentRow <= $allRows; $currentRow++)        {            $currentColumn = 'A';             $data          = new stdclass();            $ignore        = true; /* 對於空行,需要忽略,這裡通過記錄一個標記處理 */            while($currentColumn != $allColumns)            {                $cellValue = trim($currentSheet->getCell($currentColumn . $currentRow)->getValue());                                if(empty($columnKey[$currentColumn]))                {                    $currentColumn++;                    continue;                }                                $field = $columnKey[$currentColumn];                $currentColumn++;                if (empty($cellValue))                {                    $data->$field = '';                }                else                {                    $data->$field = $cellValue;                    $ignore = false;                }            }                        if ($ignore == true)            {                continue;            }                        /* 設定沒有從excel中讀到的資料 */            foreach(array_keys($fields) as $key)            {                if(!isset($data->$key))                 {                    $data->$key = '';                }            }                        $dataList[] = $data;        }                return $dataList;     }        public function setExcelFiled($count)    {        $letter = 'A';        for($i = 1; $i <= $count; $i++) $letter++;        return $letter;    }        /**     * 將一個對象寫入到檔案     *     * @param $data     : 要寫入到excel檔案的資料     *                    kind     :頁簽名稱     *                    fields   : 標題列,輸入的檔案要包含的欄位     *                    rows     :對象數組,每一個資料,這些資料會通過fields過濾,只保留fields的內容(和excel2array的傳回值格式一致)     *                    fileName : 要儲存的檔案名稱     * @param $fileType : 輸入檔案類型,包括xls和xlsx兩種類型     * @param $savePath : 檔案路徑     *     * @access  public     *     * @return  對象的array,每行資料為一個對象,array的大小為行數(不包含標題)     *          如果輸入為空白,則可能是由於參數不對或者excel檔案無法讀取     */    public function export2excel($data, $savePath = '')    {        $this->phpExcel     = new phpExcel();            $this->rawExcelData = $data;        $this->fields       = $this->rawExcelData->fields;        $this->rows         = $this->rawExcelData->rows;        $this->fieldsKey    = array_keys($this->fields);            if(!$this->rawExcelData->fileName) $this->rawExcelData->fileName = $this->rawExcelData->kind;                $this->excelKey = array();        for($i = 0; $i < count($this->fieldsKey); $i++) $this->excelKey[$this->fieldsKey[$i]] = $this->setExcelFiled($i);            /* Set file base property */        $excelProps = $this->phpExcel->getProperties();        $excelProps->setCreator('ricky');        $excelProps->setLastModifiedBy('ricky');        $excelProps->setTitle('Office XLS Document');        $excelProps->setSubject('Office XLS Document');        $excelProps->setDescription('Document generated by PHPExcel.');        $excelProps->setKeywords('office excel PHPExcel');        $excelProps->setCategory('Result file');            /* 處理第一個頁簽 */        $this->phpExcel->setActiveSheetIndex(0);        $sheetTitle = $this->rawExcelData->kind;        $excelSheet = $this->phpExcel->getActiveSheet();        /* 設定頁簽名稱 */        if($sheetTitle) $excelSheet->setTitle($sheetTitle);        foreach($this->fields as $key => $field) $excelSheet->setCellValueExplicit($this->excelKey[$key] . '1', $field, PHPExcel_Cell_DataType::TYPE_STRING);            $i = 1;        foreach($this->rows as $num => $row)        {            $i++;            foreach($row as $key => $value)            {                if(isset($this->excelKey[$key]))                {                    $excelSheet->setCellValueExplicit($this->excelKey[$key] . $i, $value, PHPExcel_Cell_DataType::TYPE_STRING);                }            }        }            /* urlencode the filename for ie. */        $fileName = $this->rawExcelData->fileName;        if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false) $fileName = urlencode($fileName);            $excelWriter = PHPExcel_IOFactory::createWriter($this->phpExcel, 'Excel5');        $excelWriter->setPreCalculateFormulas(false);        if($savePath == '')        {            header('Content-Type: application/vnd.ms-excel');            header("Content-Disposition: attachment;filename=\"{$fileName}.xls\"");            header('Cache-Control: max-age=0');                $excelWriter->save('php://output');        }        else        {            $excelWriter->save($savePath);        }    }}



測試代碼:

測試代碼中完成了excel檔案的上傳和下載:從本用戶端擇一個excel檔案匯入,然後完成解析後,再下載到用戶端。

HTML代碼很簡單,沒有css、js,只有一個file空間和一個提交按鈕。如下所示:

                



對應的背景代碼如下:

";    print_r($var);    echo "";}include_once 'parseexcel.class.php';/* 處理上傳的檔案 */if ($_FILES["file"]["error"] > 0){  echo "Error: " . $_FILES["file"]["error"] . "
"; exit;}move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);/** * excel格式: * * 姓名 | 性別 * ----------------- * ricky | 男 * xxxxx | xxx *//* 定義要讀取的列,數組的值需要和excel的每一行的標題一致或子集 */$fileds = array( 'name' => '姓名', 'sex' => '性別',);$parse = new parseExcel();/* 從上傳的檔案中解析出資料 */$rows = $parse->excel2array($_FILES["file"]["name"], $fileds);/* 注意: 測試匯入的時候,開啟這個注釋行,測試下載的時候需要關閉該注釋行 *///output($rows);exit;/* 將資料原封不動在寫入一個新的檔案,供使用者下載 */$data = new stdClass();/* excel的檔案名稱 */$data->fileName = 'ceshi';/* 頁簽的名字 */$data->kind = 'ceshi';/* excel的標題 */$data->fields = $fileds;/* 要寫入的資料 */$data->rows = $rows;$parse->export2excel($data);



上述案例只是完成了一個excel的上傳下載的準系統,還有一些設定表格樣式、合併儲存格等沒有體現在這裡,大家可以參考PHPExcel的手冊,下面是我摘出來的PHPExcel的常見的一些操作,供大家參考:

建立excel$objPHPExcel = new PHPExcel();建立一個worksheet$objPHPExcel->createSheet();$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');$objWriter-save('php://output');儲存excel(2007)$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);非2007格式:$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); $objWriter->save("xxx.xlsx");直接輸出到瀏覽器供下載header('Content-Type: application/vnd.ms-excel');header("Content-Disposition: attachment;filename=\"{$fileName}.xls\"");header('Cache-Control: max-age=0');$excelWriter->save('php://output');設定excel的屬性:建立人$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");最後修改人$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");標題$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");題目$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");描述$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");關鍵字$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");種類$objPHPExcel->getProperties()->setCategory("Test result file");設定當前的sheet$objPHPExcel->setActiveSheetIndex(0);設定sheet的name$objPHPExcel->getActiveSheet()->setTitle('Simple');設定儲存格的值$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String');$objPHPExcel->getActiveSheet()->setCellValue('A1', 12);$objPHPExcel->getActiveSheet()->setCellValue('A1', true);$objPHPExcel->getActiveSheet()->setCellValue('A1', '=SUM(C2:C4)');$objPHPExcel->getActiveSheet()->setCellValue('A1', '=MIN(B2:C5)');合併儲存格$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');分離儲存格$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');設定寬度$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);設定字型$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20);$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);設定對齊$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);$objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);設定儲存格border$objPHPExcel->getActiveSheet()->getStyle('D1')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);設定border的color$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getLeft()->getColor()->setARGB('FF993300');;$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getRight()->getColor()->setARGB('FF993300');$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getTop()->getColor()->setARGB('FF993300');$objPHPExcel->getActiveSheet()->getStyle('E1')->getBorders()->getBottom()->getColor()->setARGB('FF993300');設定填充顏色$objPHPExcel->getActiveSheet()->getStyle('F1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);$objPHPExcel->getActiveSheet()->getStyle('F1')->getFill()->getStartColor()->setARGB('FF808080');載入圖片$objDrawing = new PHPExcel_Worksheet_Drawing();$objDrawing->setName('Logo');$objDrawing->setDescription('Logo');$objDrawing->setPath('./images/officelogo.jpg');$objDrawing->setHeight(36);$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());$objDrawing = new PHPExcel_Worksheet_Drawing();
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.