1.下载phpoffice/phpexcel扩展(PHP软件包搜索安装)
composer require phpoffice/phpexcel
项目需求苦逼的码农啊,网上参考摘抄代码后亲测
(代码参考自 树下水月 - PHPOffice/PHPExcel生成省市区三级联动的excel表格 和 1O(∩_∩)O1 - PHPEXCEL 下拉框功能 和 关于PHPExcel 导出下载表格,调试器响应乱码)
2.直接上代码
public function demo()
{
$subject = 'demo';
$title = ['工种','考试科目','申报条件','姓名','性别','手机号','证件号码','出生年月','考生类别','学历','专业','现工作地址','职业资格/技能等级证书(如:无,则后面5项无需填写)','职称证书名称','职业资格等级','证书编号','发证日期','发证单位','有无专业技术职称证书(如:无,则后面5项无需填写)','职称证书名称','专业技术等级','证书编号','发证日期','发证单位','领取方式','邮寄地址','备注'];
/***** 下拉列表联动格式 *****/
$data = [
[
'name' => '湖北省', // 省
'children' => [
[
'name' => '武汉市', // 市
'children' => ['江夏区','洪山区','青山区','武昌区','汉口'] // 区,县
],
[
'name' => '宜昌市',
'children' => ['当阳市','夷陵区','庙前']
],
[
'name' => '荆州市',
'children' => ['荆州区','荆州城区']
]
]
],
];
$high = 0;
$objPHPExcel = new \PHPExcel();
$titleRow = array('A1','B1','C1','D1','E1','F1','G1','H1','I1','J1','K1','L1','M1','N1','O1','P1','Q1','R1','S1','T1','U1','V1','W1','X1','Y1','Z1','AA1','AB1','AC1','AD1');
for($a = 0; $a < count($title); $a++){
// 设置单元格的值
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($titleRow[$a], $title[$a]);
}
$supportSheet = new \PHPExcel_Worksheet($objPHPExcel, 'support'); //创建一个工作表
$objPHPExcel->addSheet($supportSheet); //插入工作表
$col = ['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'];
/*********** 下拉列表联动 ***********/
foreach ($data as $key=>$first){
$objPHPExcel->getSheetByName('support')->setCellValue($col[0].($key+1+$high),$first['name']);
$max = 0; //重置max
$secondNum = count($first['children']);
foreach ($first['children'] as $index=>$second){
$objPHPExcel->getSheetByName('support')->setCellValue($col[$index+1].($key+1+$high),$second['name']);
$thirdNum = count($second['children']);
if ($thirdNum > $max){
$max = $thirdNum;
}
foreach ($second['children'] as $id=>$third){
$objPHPExcel->getSheetByName('support')->setCellValue($col[$index+1].($key+1+$high+$id+1),$third);
}
//定义三级名称
$objPHPExcel->addNamedRange(
new \PHPExcel_NamedRange(
$second['name'],
$objPHPExcel->getSheetByName('support'),
$col[$index+1].($key+1+$high+1).':'.$col[$index+1].($key+1+$high+1+$thirdNum-1)
)
);
}
//定义二级名称
$objPHPExcel->addNamedRange(
new \PHPExcel_NamedRange(
$first['name'],
$objPHPExcel->getSheetByName('support'),
$col[1].($key+1+$high).':'.$col[1+$secondNum-1].($key+1+$high)
)
);
$high += $max;
}
//移花接木
foreach ($data as $var=>$content){
$objPHPExcel->getSheetByName('support')->setCellValue('UI'.($var+1),$content['name']);
}
//定义顶级名称
/*$total = count($data);
$str = '';
$count = 0;
$max = 0;
for ($i = 0;$i < $total;$i++){
$str .= $col[0].(1+$count+$i).',';
$secondCount = count($data[$i]['children']);
for ($j = 0;$j < $secondCount;$j++){
if (count($data[$i]['children'][$j]['children']) > $max){
$max = count($data[$i]['children'][$j]['children']);
}
}
$count += $max;
}
$str = rtrim($str,',');
$objPHPExcel->addNamedRange(
new \PHPExcel_NamedRange(
'region',
$objPHPExcel->getSheetByName('support'),
$str
)
);*/
$total = count($data);
$objPHPExcel->addNamedRange(
new \PHPExcel_NamedRange(
'region',
$objPHPExcel->getSheetByName('support'),
'UI1'.':'.'UI'.$total
)
);
//数据验证
for ($i = 2;$i <= 500;$i++){
$objValidation = $objPHPExcel->getActiveSheet()->getCell('A'.$i)->getDataValidation(); // 设置在A列
$objValidation->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST );
$objValidation->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
$objValidation->setAllowBlank(false);
$objValidation->setShowInputMessage(true);
$objValidation->setShowErrorMessage(true);
$objValidation->setShowDropDown(true);
$objValidation->setErrorTitle('输入错误');
$objValidation->setError('不在列表中的值');
$objValidation->setPromptTitle('请选择');
$objValidation->setPrompt('请从列表中选择一个值.');
$objValidation->setFormula1("=region"); //设置公式1
$objValidation = $objPHPExcel->getActiveSheet()->getCell('B'.$i)->getDataValidation(); // 设置在B列
$objValidation->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST );
$objValidation->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
$objValidation->setAllowBlank(false);
$objValidation->setShowInputMessage(true);
$objValidation->setShowErrorMessage(true);
$objValidation->setShowDropDown(true);
$objValidation->setErrorTitle('输入错误');
$objValidation->setError('不在列表中的值');
$objValidation->setPromptTitle('请选择');
$objValidation->setPrompt('请从列表中选择一个值.');
$objValidation->setFormula1('=INDIRECT($'.'A'.'$'.$i.')'); //设置公式1,绑定A列
$objValidation = $objPHPExcel->getActiveSheet()->getCell('C'.$i)->getDataValidation(); // 设置在C列
$objValidation->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST );
$objValidation->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION );
$objValidation->setAllowBlank(false);
$objValidation->setShowInputMessage(true);
$objValidation->setShowErrorMessage(true);
$objValidation->setShowDropDown(true);
$objValidation->setErrorTitle('输入错误');
$objValidation->setError('不在列表中的值');
$objValidation->setPromptTitle('请选择');
$objValidation->setPrompt('请从列表中选择一个值.');
$objValidation->setFormula1('=INDIRECT($'.'B'.'$'.$i.')'); //设置公式1,绑定B列
}
/*********** 下拉列表联动结束 ***********/
/************ 下拉列表 ************/
// 级别
// $enroll_level = Dictionary::query()
// ->where('code_type','enroll_level')
// ->orderBy('sort','DESC')
// ->pluck('name')->toArray();
$spectials = [
['column'=>'E','select_options'=>['男','女']],// 性别
// ['column'=>'F','select_options'=>$enroll_level],// 级别
];
$objActSheet = $objPHPExcel->getActiveSheet();
foreach($spectials as $spectial)
{
$optionsString = null;
$optionsString = implode(',', $spectial['select_options']);
$n = 2;
$num = 500;
// 我这里设置500行,可自行设置
while($n <= $num) {
$objValidation = $objActSheet->getCell($spectial['column'].(string)$n)->getDataValidation(); //这一句为要设置数据有效性的单元格
// $objValidation的各项设置参数可详见phpexcel文件,
// 目录大概为/.../phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5/Worksheet.php
// 2767行 方法名:writeDataValidity
$objValidation -> setType(\PHPExcel_Cell_DataValidation::TYPE_LIST)
-> setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_STOP)
-> setAllowBlank(true)
-> setShowInputMessage(true)
-> setShowErrorMessage(true)
-> setShowDropDown(true)
-> setErrorTitle('输入的值有误')
-> setError('您输入的值不在下拉框列表内.')
-> setPromptTitle('')
-> setPrompt('')
-> setOperator(\PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN)
-> setFormula1('"'.$optionsString.'"');
$n++;
}
}
/*********** 下拉列表结束 ************/
/************* 时间格式限制 **************/
for ($ii=2; $ii<=500; $ii++)
{
$objPHPExcel->getActiveSheet()->getStyle("H".(string)$ii)->getNumberFormat()->setFormatCode("YYYY-m-d");
$objPHPExcel->getActiveSheet()->getStyle("Q".(string)$ii)->getNumberFormat()->setFormatCode("YYYY/m/d");
}
$objPHPExcel->setActiveSheetIndex(0);
//输出表格
$filename = $subject.date('Ymd').time().'.xlsx'; // 表格名称
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename='.$filename);
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($filename); // 保存
// 直接下载
// ob_end_clean();//清除缓冲区,避免乱码
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8'); //
// header("Pragma: public");
// header("Expires: 0");
// header("Access-Control-Allow-Origin:*");
// header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
// header("Content-Type:application/force-download");
// header("Content-Type:application/octet-stream");
// header("Content-Type:application/download");
// header('Content-Disposition: attachment;filename='.$filename);
// header('Cache-Control: max-age=0');
// $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
// $objWriter->save('php://output');
// exit();
}直接下载浏览器调试器响应是乱码,不能AJAX请求,改成浏览器直接访问
(感谢博客共享和码农们的不懈努力)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号