下载
适用于 PHP7.4 以下版本
代码
// 第一步 - 准备下载数据
require_once "/vendor/PHPExcel/PHPExcel.php";
// 导出数据
$data = array(
0=>array(
'mobiles'=>'13555555555',
'gender'=>'男',
'age'=>'25',
),
1=>array(
'mobiles'=>'15333333333',
'gender'=>'女',
'age'=>'24',
)
);
// 数据列表头
$cellName = array(
'mobiles'=>'电话',
'gender'=>'性别',
'age'=>'年龄',
);
\PHPExcel::exportData($data, $cellName);
下边是我写的自定义函数,根据自己需要调整~~
/********************** 自定义函数开始 **********************/
/**
* @author WangWeiChen
* @mail 97975530@qq.com
* @date 2022-01-12 16:00
*/
/**
* [getTableHeader 根据数据列表头,获取对应的 EXCEL 列名, 最多只能获取到 Z 列~~]
* @param array $cellName [数据列表头数组 array('name=>'名称','gender'=>'性别','age'=>'年龄')]
* @return array $header [字母列 array('A','B','C')]
*/
function getTableHeader($cellName){
$count = count($cellName);
$header = array();
for($i='A',$k=0; $i<='Z'; $i++,$k++){
if($k == $count){
break;
}
$header[] = $i;
}
return $header;
}
/**
* [exportData 导出Excel表格]
* @param array $data [数据]
* @param array $cellName [数据列表头]
* @param string $fileName [文件名]
* @param string $sheet_name [sheet表 名称]
* @param string $title [首行标题]
* @param string $type [状态: upload-下载 save:保存至本地]
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
* @throws PHPExcel_Writer_Exception
*/
Static function exportData($data, $cellName = array(), $fileName = '', $sheet_name = 'Worksheet', $title = '', $type = 'upload'){
$time = time();
if (empty($data)) exit(json_encode(array('code'=>1001, 'msg'=>'导出数据为空')));
if (empty($cellName)) exit(json_encode(array('code'=>1001, 'msg'=>'数据列表头为空')));
if (empty($fileName)) $fileName = date('Y-m-d H-i-s', $time);
$suffix = '.xls';
$objPHPExcel = new PHPExcel();
$sheet = $objPHPExcel->getActiveSheet(); // 当前活动 sheet
$topNumber = 1; // 起始行为第一行
// 根据数据列表头,获取对应的 EXCEL 列名
$cell = $objPHPExcel->getTableHeader($cellName);
// 获取数据列表头键名, 例 array('name','gender','age)
$cellNameKey = array_keys($cellName);
// 将表头插入数据数组
$cellNameArray[0] = $cellName;
$newData = array_merge($cellNameArray, $data);
// 处理首行标题 开始
if(!empty($title)){
$sheet->mergeCells("A{$topNumber}:" . end($cell) . $topNumber); // 合并必须放到第一步
$objPHPExcel->setActiveSheetIndex(0)->setCellValue("A{$topNumber}", $title); // 插入内容
$sheet->getRowDimension($topNumber)->setRowHeight(26); // 行高
// 内容对齐方式
$sheet->getStyle("A{$topNumber}")
->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
// 内容格式
$sheet->getStyle("A{$topNumber}")
->applyFromArray(['font' => ['bold' => true]]) // 加粗
->getFont()->setSize(16); // 字体大小
$topNumber += 1; // 如果有首行标题,则数据从第二行开始
}
// 处理首行标题 结束
$startRow = $topNumber; // 数据在表格中的起始行
// 处理列表头 - 开始
$sheet->getRowDimension($startRow)->setRowHeight(22); //行高
// 内容对齐方式
$sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
// 内容格式
$sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
->applyFromArray(['font' => ['bold' => true]]) // 加粗
->getFont()->setSize(14); // 字体大小
// 背景颜色
$sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
->getFill()
->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)
->getStartColor()
->setRGB('C0C0C0');
// 设置边框
$border_style= array('borders' => array('allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
$sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)->applyFromArray($border_style);
// 处理列表头 - 结束
// 公众设置
$objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 表格内容默认水平居中
$objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 表格内容默认垂直居中
$sheet->setTitle($sheet_name); // 设置活动 sheet 名称
// 插入数据
$cellLen = array();
foreach($newData as $dataKey=>$dataVal){
foreach($cellNameKey as $indexKey=>$indexVal){
$cellLen[$cell[$indexKey]] = $len = $cellLen[$cell[$indexKey]] > strlen($dataVal[$indexVal]) ? $cellLen[$cell[$indexKey]] : strlen($dataVal[$indexVal]); // 根据数据宽度自动设置列宽
$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($cell[$indexKey])->setWidth($len+2);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cell[$indexKey].$startRow,$dataVal[$indexVal]);
}
$startRow++;
}
$objWrite = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$ua = $_SERVER["HTTP_USER_AGENT"];
ob_end_clean();
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
if ($suffix == '.xlsx') {
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
} else {
header('Content-Type: application/vnd.ms-excel');
}
if (preg_match("/MSIE/", $ua) || preg_match('/edge/', $ua) || preg_match('/edg/', $ua)) {
$encoded_filename = urlencode($fileName);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $fileName . '"');
} else if (preg_match("/Safari/", $ua) || preg_match("/WeChat/", $ua)) {
$attachment = 'attachment; filename*=utf-8\'\'' . rawurlencode($fileName);
header('Content-Disposition: ' . $attachment);
} else {
header('Content-Disposition: attachment; filename="' . $fileName . '"');
}
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
if ($type == 'upload'){
$objWrite->save('php://output');
} else {
$objWrite->save($_SERVER['DOCUMENT_ROOT'] . CLUE_UPLOAD_PATH . $fileName);
}
exit();
}
/********************** 自定义函数结束 **********************/