PHPExcel類是php一個excel表格處理插件,最近因爲工做須要用到了這個插件,完成了一個excel導入導入的功能。如今將主要邏輯整理一下和你們分享,有須要的能夠參考一下。 php
下面的事例只是完成了一個excel的上傳下載的基本功能,還有一些設置表格樣式、合併單元格等操做沒有體如今這裏,你們能夠參考PHPExcel的手冊,事例後面是我摘出來的PHPExcel的常見的一些操做,供你們參考: css
將PHPExcel提供的API根據須要封裝成一個供上傳和下載使用的類,其實就是兩個函數,一個用於上傳一個用於下載,這裏我就直接將代碼貼出來了。 html
<?php /* PHPExcel庫能夠從https://phpexcel.codeplex.com/下載,例子中用的版本是1.8.0 */ require_once dirname(__FILE__) . '/PHPExcel/PHPExcel.class.php'; class parseExcel { function __construct() { /* do nothing */ } /** * 將excel文件轉化爲一個二維數組(這裏尚未考慮excel中的頁籤) * 將excel的內容所有讀取回去 * 第一行爲標題行,不在返回的數據裏面 * * @param $file : excel文件名 * @param $filed: 要讀取的列 * * @access public * * @return 對象的array,每行數據爲一個對象,array的大小爲行數(不包含標題) * 每一行是一個對象 */ public function excel2array($file, $fields = array()) { /* 若是文件名爲空或者要讀取的列爲空,則返回一個空的數組 */ if ($file == "" || count($fields) == 0) { return array(); } /* 建立reader */ $phpReader = new PHPExcel_Reader_Excel2007(); if(!$phpReader->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空間和一個提交按鈕。以下所示: 瀏覽器
<!doctype html> <html> <body> <form action="excel.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
<?php function output($var) { echo "<xmp class='a-left'>"; print_r($var); echo "</xmp>"; } include_once 'parseexcel.class.php'; /* 處理上傳的文件 */ if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; 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 $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();