PHPExcel導出縱向合併單元格——第二種

TP5框架,使用PHPExcel導出可縱向合併單元格的excel表格,PHPExcel插件放在根目錄下vendor文件夾內。
1、controller目錄中控制器,Order.php

<?php
namespace app\index\controller;
use app\index\model\ExcelDown; //excel導出
class Order{
	public function download(){
        //獲取數據,並重組
        $w = [
			['goods_name'=>'紅提','member_id'=>9,'nickname'=>'小新','goods_num'=>1,'amount'=>'26.80','sort'=>1],
			['goods_name'=>'海南綠橙','member_id'=>9,'nickname'=>'小新','goods_num'=>3,'amount'=>'108.00','sort'=>2],
			['goods_name'=>'甘蔗','member_id'=>9,'nickname'=>'小新','goods_num'=>1,'amount'=>'25.60','sort'=>3],
			['goods_name'=>'海南綠橙','member_id'=>10,'nickname'=>'小白','goods_num'=>1,'amount'=>'36.00','sort'=>4],
			['goods_name'=>'紅棗','member_id'=>11,'nickname'=>'大熊','goods_num'=>2,'amount'=>'18.80','sort'=>5],
			['goods_name'=>'芒果','member_id'=>17,'nickname'=>'胖虎','goods_num'=>3,'amount'=>'45.90','sort'=>6],
			['goods_name'=>'山竹','member_id'=>17,'nickname'=>'胖虎','goods_num'=>2,'amount'=>'28.00','sort'=>7]
		];
        // print_r($w);exit;

        //excel表參數
        $data = array(
            'letter'=>array('A','B','C','D','E','F'),
            'width'=>array('6','20','14','20','15','10'),
            'header'=>array('序號','暱稱','累計下單數','商品名稱','數量','支付金額'),
            'sheetname'=>'購買記錄表',
            'filename'=>'購買記錄表(' . date('Ymd') . ').xls',
            'field'=>array('sort','nickname','order_num','goods_name','goods_num','amount'), //數據字段名
        );

        //導出數據
        $excelc = new ExcelDown();
        $res = $excelc->push($w,$data);
    }
}
?>

2、model中模型,ExcelDown.php

<?php
namespace app\index\model;
use think\Model;
use think\Db;
class ExcelDown extends Model{
	public function __construct(){
		vendor("PHPExcel.PHPExcel"); //導入PHPExcel類庫(文件路徑:/excel/vendor/)
	}
	/**
	 * 導出excel表格
	 * @param array $res 要導出的數據
	 * @param array $data 表格參數
	 * @param string $imgPath 圖片路徑
	 * @param array $imgLetter 圖片要插入的表格列
	 */
	function push($res,$data,$imgPath='',$imgLetter=''){
		$objPHPExcel = new \PHPExcel();
		
		//設置excel文件右鍵屬性所顯示的信息
		$objPHPExcel->getProperties()->setCreator("xxx") //作者
			->setLastModifiedBy("xxx")	//最後一次保存者
			->setTitle("Office 2003 XLS Test Document") //標題
			->setSubject("Office 2003 XLS Test Document") //主題
			->setDescription("Test document for Office 2003 XLS, generated using PHP classes.") //描述
			->setKeywords("office 2003 openxml php") //標註
			->setCategory("Test result file"); //類別
		 
		//設置列寬
		for($i=0;$i<count($data['letter']);$i++){
			$objPHPExcel->getActiveSheet()->getColumnDimension($data['letter'][$i])->setWidth($data['width'][$i]);
		}
		
		//設置行高度
		$objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(18);
		$objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(18);
		$objPHPExcel->getActiveSheet()->getRowDimension('3')->setRowHeight(18);
		 
		//設置字體大小
		$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10);
		//設置字體粗體
		$objPHPExcel->getActiveSheet()->getStyle('A3:'.end($data['letter']).'3')->getFont()->setBold(true);
		//設置文字垂直居中
		$objPHPExcel->getActiveSheet()->getStyle('A3:'.end($data['letter']).'3')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
		//設置表格框線
		$objPHPExcel->getActiveSheet()->getStyle('A1:'.end($data['letter']).'3')->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);
		 
		//設置標題字體粗體
		$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
		//設置標題字體大小
		$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(12);
		//設置標題文字水平居中
		$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		//設置標題文字垂直居中
		$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
		
		//設置副標題水平居右
		$objPHPExcel->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
		
		//設置水平居中
		for($i=0;$i<count($data['letter']);$i++){
			$objPHPExcel->getActiveSheet()->getStyle($data['letter'][$i].'3')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
			$objPHPExcel->getActiveSheet()->getStyle($data['letter'][$i])->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		}
		 
		//橫向合併單元格
		$objPHPExcel->getActiveSheet()->mergeCells('A1:'.end($data['letter']).'1');
		$objPHPExcel->getActiveSheet()->mergeCells('A2:'.end($data['letter']).'2');
		 
		//設置表頭內容
		for($i=0;$i<count($data['letter']);$i++){
			$objPHPExcel->setActiveSheetIndex(0)
				->setCellValue('A1', $data['sheetname'])
				->setCellValue('A2', '導出時間:' . date('Y-m-d H:i',time()))
				->setCellValue($data['letter'][$i].'3', $data['header'][$i]);
		}
		
		for($i=0;$i<count($res['goods']);$i++){
			for($j=0;$j<count($data['letter']);$j++){
				$objPHPExcel->getActiveSheet(0)->setCellValue($data['letter'][$j].($i+4),$res['goods'][$i][$data['field'][$j]]);
			}
			//設置文字垂直居中
			$objPHPExcel->getActiveSheet()->getStyle('A'.($i+4).':'.end($data['letter']).($i+4))->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
			//設置表格框線
			$objPHPExcel->getActiveSheet()->getStyle('A'.($i+4).':'.end($data['letter']).($i+4))->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);
			//設置行高
			$objPHPExcel->getActiveSheet()->getRowDimension($i+4)->setRowHeight(18);
			//自動換行
			$objPHPExcel->getActiveSheet()->getStyle('A'.($i+4).':'.end($data['letter']).($i+4))->getAlignment()->setWrapText(true);
			
			//縱向合併同一用戶
			if($i>=1 &&($res[$i]['member_id']==$res[$i-1]['member_id'])){
				$objPHPExcel->getActiveSheet()->mergeCells('B'.($i+3).':B'.($i+4));
				$objPHPExcel->getActiveSheet()->mergeCells('C'.($i+3).':C'.($i+4));
			}
		}

		//設置工作表名稱
		$objPHPExcel->getActiveSheet()->setTitle($data['sheetname']);
		
		//將活動表索引設置爲第一個表,因此Excel將作爲第一個表打開此表
		$objPHPExcel->setActiveSheetIndex(0);
		
		ob_end_clean(); //清除緩衝區,避免亂碼
		
		// 將輸出重定向到一個客戶端web瀏覽器(Excel2007)
		header('Content-Type: application/vnd.ms-excel');
		header('Content-Disposition: attachment;filename='.$data['filename']);
		header('Cache-Control: max-age=0');
		
		//要是輸出爲Excel2007,使用 Excel2007對應的類,生成的文件名爲.xlsx。
		//如果是Excel2003及以下,使用Excel5,對應生成.xls文件
		//$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
		$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
		
		//支持瀏覽器下載生成的文檔
		$objWriter->save('php://output');
		
		//支持保存生成的文件在當前目錄下,直接文件名做爲參數
		// $objWriter->save('test.xlsx');
	}
}
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章