**
首先用composer在項目裏安裝phpexcel在composer.json require里加入 “moonlandsoft/yii2-phpexcel”,然後composer update即可
**
1.這裏在項目裏先創建個工具類common/utils/Exportfile.php,用該類實現導出,其他類調用該類的exportExcel方法即可,
<?php
namespace common\utils;
use Yii;
class ExportFile
{
/**
*---------------------------------------
* 導出數據爲excel表格
* @param $list 數據集合二維數組
* @param $attributeLabels 字段集一維數組
* @param string $filename 文件名
* @param array $setRowHeight 行高
* @param array $setWidth
* @param $paramenterHeight 參數高度
* @param $rows 給某一個Execl中的某一行單獨設置樣式
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
* @throws \PHPExcel_Writer_Exception
*---------------------------------------
*/
public static function exportExcel($list, $attributeLabels=null, $filename = '', $setRowHeight = [], $setWidth = [], $paramenterHeight = '',$orderName='')
{
$objectPHPExcel = new \PHPExcel();//實例化通過composer安裝的PHPExcel
$n = 1;//用於數據循環
//表頭
$cellName = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ',
'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ',
'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'CG', 'CH', 'CI', 'CJ', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CQ', 'CR', 'CS', 'CT', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ'
];
$attributeLabelsKey = array_keys($attributeLabels);
$attributesLength = count($attributeLabelsKey);
//設置邊框
//X表示Excel表格列,Y表示Excel表格行,A1表示第一行第一列
$x = $cellName[count($attributeLabels) - 1];
$y = count($list)+2;//多出2行 來寫標題
//不同的訂單 設置不同的模板
if($orderName == '衣服訂單'||$orderName == '電子設備訂單'){
$y = count($list)+1;
}
// \common\utils\Tool::debuglog('第一步',date('Ym').'.txt');
//Excel表格邊框 設置單元格邊框 從a1到最後
$objectPHPExcel->getActiveSheet()->getStyle('A1:'.$x.($y))->applyFromArray([
'borders' => [
'allborders' => [
'style' => \PHPExcel_Style_Border::BORDER_THIN,//粗的是thick
]
]
]);
//設置表格樣式(背景顏色和邊框線)
if(!empty($paramenterHeight)&& is_array($paramenterHeight)){
foreach ($paramenterHeight as $rownum => $value){
$rownum = $rownum + 1;
if(isset($value['border'])){
//Excel表格邊框
$objectPHPExcel->getActiveSheet()->getStyle('A'.($rownum).':'.$x.($rownum))->applyFromArray([
'borders' => [
'bottom' => [//底部邊框
'style' => $value['border'],//粗的是thick
]
]
]);
}
if(isset($value['backgroundcolor'])){
//excel表格背景顏色
$objectPHPExcel->getActiveSheet()->getStyle('A'.($rownum).':'.$x.($rownum))->applyFromArray([
'fill' => [
'type' => \PHPExcel_Style_Fill::FILL_SOLID,//單元格屬性
'color'=> ['rgb' => $value['backgroundcolor']]//背景顏色
]
]);
}
}
}
//自定義控制高度
foreach ($setRowHeight as $k => $v) {
if ($k === 'height') {
$objectPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight($v);
} elseif ($k == 'specific' && is_array($v)) {
foreach ($v as $row => $height) {
$objectPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight($height);
}
}
}
//Excel第一行開始
//合併單元格
$nameVal = $filename;
if($orderName == '衣服訂單'||$orderName == '電子設備訂單'){
$nameVal = $orderName == '衣服訂單'?'xxxx有限公司'."\r\n".'---':'xxxx有限公司'."\r\n".'電子設備訂單';
//自動換行 對齊屬性
$objectPHPExcel->getActiveSheet()->getStyle("A1:D1")->getAlignment()->setWrapText(true);
}
//設置A1名稱值和樣式
$objectPHPExcel->getActiveSheet()->mergeCells("A1:{$x}1");//指定要合併的單元格範圍 (第一行)
$objectPHPExcel->getActiveSheet()->setCellValue('A1', $nameVal); //設置值
$objectPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//設置垂直居中
$objectPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//設置水平居中
$objectPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('Candara'); //設置字體
$objectPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(14);//字體大小
$objectPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);//是否加粗
$imgPath = Yii::getAlias('@backend') . '/web/Mresources/images/logo.png';
if (file_exists($imgPath)) {
// 圖片生成
$objDrawing = new \PHPExcel_Worksheet_Drawing();
$objDrawing->setPath($imgPath);
// 設置寬度高度
$objDrawing->setHeight(80);//照片高度
$objDrawing->setWidth(80); //照片寬度
//設置圖片要插入的單元格
$objDrawing->setCoordinates('A1', $imgPath);
// 圖片偏移距離
$objDrawing->setOffsetX(35);
$objDrawing->setOffsetY(35);
$objDrawing->setWorksheet($objectPHPExcel->getActiveSheet());
}
//Excel頭部第一行設置內容和樣式結束
//水平居中
$objectPHPExcel->setActiveSheetIndex(0)->getStyle("C")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//自動換行
$objectPHPExcel->getActiveSheet()->getStyle("C3:C$y")->getAlignment()->setWrapText(true);
if($orderName != '衣服訂單'&&$orderName != '電子設備訂單'){
//array_merge將兩個數組的數據整合成一個數組
$list = array_merge([$attributeLabels], $list);
}
foreach ($list as $row) {
$n++; //計數
$row = (object)$row;
//$attributesLength代表屬性的個數,$attributeLabelsKey代表屬性的值
for ($i = 0; $i < $attributesLength; $i++) {
$key = $attributeLabelsKey[$i];
//判斷$row是否存在,判斷.jpg和.png
if (isset($row->$key)) {
if(is_array($row->$key) ){
if(isset($row->$key[0])){
$objectPHPExcel->getActiveSheet()->setCellValue($cellName[$i] . $n, $row->$key[0]); //設置值
}
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i] . $n)->getFont()->setBold(isset($row->$key['bold'])&&!empty($row->$key['bold'])?$row->$key['bold']: false);
}else{
if (strpos($row->$key, '.jpg') !== false || strpos($row->$key, '.png')) {
$imgPath = Yii::getAlias('@backend') . '/web/Mresources/' . $row->$key;
if (file_exists($imgPath)) {
$objDrawing = new \PHPExcel_Worksheet_Drawing();
$objDrawing->setPath($imgPath);
// 設置寬度高度
$objDrawing->setHeight(80);//照片高度
$objDrawing->setWidth(80); //照片寬度
//設置圖片要插入的單元格
$objDrawing->setCoordinates($cellName[$i] . $n, $imgPath);
// 圖片偏移距離
$objDrawing->setOffsetX(12);
$objDrawing->setOffsetY(12);
$objDrawing->setWorksheet($objectPHPExcel->getActiveSheet());
continue;
}
$row->$key = '';
}
$objectPHPExcel->getActiveSheet()->setCellValue($cellName[$i] . $n, $row->$key ?: ''); //設置值
}
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i] . $n)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//設置垂直居中
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i] . $n)->getAlignment()->setWrapText(true);
$objectPHPExcel->getActiveSheet()->getColumnDimension($cellName[$i])->setWidth(isset($setWidth[$i])&&$setWidth[$i]>0?$setWidth[$i]:25);//設置寬度
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i])->getFont()->setSize(14);
if (isset($row->$key['left'])) {
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i])->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
} else {
$objectPHPExcel->getActiveSheet()->getStyle($cellName[$i] . $n)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//設置水平居中
}
if (isset($row->$key['merge'])&& is_array($row->$key['merge'])) { //衣服訂單調整
$str = "";
foreach($row->$key['merge'] as $val){
$str = empty($str)?$val.$n:$str.":".$val.$n;
}
if(!empty($str)){
$objectPHPExcel->getActiveSheet()->mergeCells($str);// 指定第N行 B到D列合併
}
}
}
}
// 下載一個pdf文件
//header('Content-Type:application/pdf');
//header('Content-Disposition:attachment;filename="01simple.pdf"');
//header('Cache-Control:max-age=0');
//$objWriter =PHPExcel_IOFactory::createWriter($objPHPExcel,'PDF');
//$objWriter->save('php://output');
//數據結束
ob_end_clean();//清空緩存區並關閉輸出緩存
ob_start();//在服務器打開一個緩存區來保存所有的數據
$excelName = iconv("utf-8", "gbk", $filename);//轉碼
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $excelName . $date . '.xls"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objectPHPExcel, 'Excel5');
$objWriter->save('php://output');//輸出excel文件,並自動下載
}
}
//適配多個模板
2.order.php
$f = ['cat_id' => '商品類型', 'goods_name'=>'商品名稱' , 'goods_number'=>'數量'];
$fileName = $info->name.' -- 簡易清單';
$setRowHeight = [
'height' => 30, //默認高度
'specific' => [ //指定高度
1 => 70 //第幾行 => 高度
]
];
$setWidth = [
29,29,29
];
/*
$f = ['A'=>'', 'B' => '' , 'C' => '' , 'D'=>'' ];
$setRowHeight = [
'height' => 30, //默認高度
'specific' => [ //指定高度
1 => 70 //第幾行 => 高度
]
];
$setWidth = [
20,15,25
];
//設置邊框及背景顏色
$paramenterHeight = [
$num => ['border' => \PHPExcel_Style_Border::BORDER_THICK],//全邊框樣式
$titleRowNum => ['backgroundcolor' => 'BFBFBF'],//標題行數的背景顏色
$titleRowNum-1 => ['border' => \PHPExcel_Style_Border::BORDER_THICK]
]; */
//$list 爲二維數組 字段對應 $f裏面的key
ExportFile::exportExcel($list , $f , $fileName , $setRowHeight , $setWidth,'',$orderName = '簡易清單');