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 = [
['users']=>[
['nickname'=>'小新','member_id'=>9,'order_num'=>49,'list_num'=>3],
['nickname'=>'小白','member_id'=>10,'order_num'=>6,'list_num'=>1],
['nickname'=>'大熊','member_id'=>11,'order_num'=>17,'list_num'=>1],
['nickname'=>'胖虎','member_id'=>17,'order_num'=>9,'list_num'=>2]
],
['goods']=>[
['goods_name'=>'紅提','nickname'=>'小新','goods_num'=>1,'amount'=>'26.80','sort'=>1],
['goods_name'=>'海南綠橙','nickname'=>'小新','goods_num'=>3,'amount'=>'108.00','sort'=>2],
['goods_name'=>'甘蔗','nickname'=>'小新','goods_num'=>1,'amount'=>'25.60','sort'=>3],
['goods_name'=>'海南綠橙','nickname'=>'小白','goods_num'=>1,'amount'=>'36.00','sort'=>4],
['goods_name'=>'紅棗','nickname'=>'大熊','goods_num'=>2,'amount'=>'18.80','sort'=>5],
['goods_name'=>'芒果','nickname'=>'胖虎','goods_num'=>3,'amount'=>'45.90','sort'=>6],
['goods_name'=>'山竹','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);
}
//縱向合併單元格
$start = 4;
for($m=0;$m<count($res['users']);$m++){
$end = $start + (int)$res['users'][$m]['list_num'] - 1;
$objPHPExcel->getActiveSheet()->mergeCells('B'.$start.':B'.$end);
$objPHPExcel->getActiveSheet()->mergeCells('C'.$start.':C'.$end);
$start += (int)$res['users'][$m]['list_num'];
}
//設置工作表名稱
$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');
}
}
?>