引入
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\IWriter;
方法
public function upload(Request $request){
$file = $request->file('file');
$info = $file->move('upload'); // 已保存到本地
$filename = $file->getinfo();
$filename =$filename['name'];
preg_match('/\d+/', $filename, $slef_filename);
$slef_file_date = $slef_filename[0]; // 上传文件的日期
if ($info && $slef_file_date){
//绝对路径,把反斜杠(\)替换成斜杠(/) 因为在 windows下上传路是反斜杠径
$file_real_path = str_replace("\\", "/", $info->getRealPath()); // 本地路径
$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_real_path); // 实例化加载文件
$countSheet = $objPHPExcel -> getSheetCount(); // 一共几张工作表
$all_arr = [];
$num_arr = [];
for ($rr = 0; $rr < $countSheet; $rr++)
{
$currentSheet = $objPHPExcel -> getSheet($rr); // 遍历所有工作表
// $dataArray[$i] = $currentSheet -> toArray(); // 每一张 sheet 表都读成数组
// 数据表
if($rr == 0 || $rr == 2 || $rr == 4){
$highestRow = $currentSheet->getHighestRow(); // 取得总行数
$data = [];
//循环读取excel表格,整合成数组。如果是不指定key的二维,就用$data[i][j]表示。
for ($j = 1; $j <= $highestRow; $j++) { // 起始行数
// $data[$j - 2] = [
$data[] = [
'list_name' => $currentSheet->getCell("A" . $j)->getValue(),
'tel' => $currentSheet->getCell("B" . $j)->getValue(),
'land' => $currentSheet->getCell("C" . $j)->getValue(),
'www' => $currentSheet->getCell("D" . $j)->getValue()
// 'create_time' => time()
];
// var_dump($data[$j - 2]);
}
$list_arr = [];
foreach ($data as $k => $v) {
if($v['list_name']){
$l['list_name'] = $v['list_name']; // 所有项目名的下标,获得下标数组
$l['key'] = $k;
$list_arr[] = $l;
}
}
$a = [];
$list_count = count($list_arr); // 数组长度
for($i=0;$i<count($list_arr);$i++){
$h = [];
foreach ($data as $k => $v) { // 以某一行为区分 进行拆分内容,取出2行中间的内容新生成exce
$n = [];
if($i != $list_count-1 && $k< $list_arr[$i+1]['key'] && $k> $list_arr[$i]['key'] ){
$v['list'] = $list_arr[$i]['list_name'];
$n = $v;
$h = $v;
$a[] = $n;
}
if($i == $list_count-1 && $k > $list_arr[$i]['key'] ){ // 如果该项目下有>=1条数据
$v['list'] = $list_arr[$i]['list_name'];
$n = $v;
$h = $v;
$a[] = $n;
}
}
if(count($h) == 0){ // 如果空,即该项目下没有一条数据
$h['list'] = $list_arr[$i]['list_name'];
$a[] = $h;
}
}
// 把 key 值相同的合到一个数组 222
foreach ($a as $key => $v) {
$all_arr[$v['list']][] = $v;
}
}
// 统计表
if($rr == 1 || $rr == 3 || $rr == 5){
$dataArray = $currentSheet -> toArray();
foreach ($dataArray as $key => $v) {
$num_arr[$v[0]][] = $v[1];
}
}
}
$num =[];
foreach ($num_arr as $k => $v) { // 原始两张统计表的总和
$t = '';
$nh['list_name'] = $k;
foreach ($v as $o => $p) {
$t += $p;
}
$nh['count'] = $t;
$num[] = $nh;
}
// 以上,是整合 多张 sheet
// 下面是导出 excel 及 压缩
$saveFile_url_all = [];
$saveFile_name_all = [];
foreach ($all_arr as $k => $v) { // $v 每个项目的数组 $k 项目名
$saveFile ='upload/'.$k.'-'.date('Y').$slef_file_date.'.xlsx'; // 文件保存名称,设置 upload 目录下
$inputFileName = ROOT_PATH . DS . 'public' . DS . $saveFile; // 本地保存路径
// 分别导出为 独立 Excel
$newExcel = new Spreadsheet(); //创建一个新的excel文档
$objSheet = $newExcel->getActiveSheet(); //获取当前操作sheet的对象
$objSheet->setTitle($k); //设置当前sheet的标题
$newExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$newExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
$newExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
$newExcel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
$newExcel->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
$objSheet->setCellValue('A1', '归属地')
->setCellValue('B1', '来源')
->setCellValue('C1', '客户有效性')
->setCellValue('D1', '客户意向度')
->setCellValue('E1', '需求匹配度');
$isset_tel = false;
foreach ($v as $o => $p) {
$u = $p['tel'];
if(!isset($u)){ // 判断是否组合中有空数据
$isset_tel = true;
}
if(isset($u)){ // 避免出现 100% 的数据行
// 设置每行的内容
$objSheet-> setCellValue('A' . ($o+2), $p['land'])
->setCellValue('B' . ($o+2), $p['www'])
->setCellValue('C' . ($o+2), $u)
->setCellValue('D' . ($o+2), $u)
->setCellValue('E' . ($o+2), $u);
}
}
// 拆分创建生成不同文件
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($newExcel);
$writer -> save($saveFile);
$ee = [];
$ee['name'] = str_replace('upload/','',$saveFile); // 文件名
$ee['simple_name'] = $k;
// if(isset($v[0]['tel']) && count($v) > 1){
if($isset_tel == false && count($v) >= 1){
$ee['count'] = count($v); // 被生成文件中数据条数
// else if(!isset($v[0]['tel']) && count($v) > 1){
}else if($isset_tel == true && count($v) > 1){ // 当1个工作表中为0,另一个工作表中有数据时,去除空数组的统计
$ee['count'] = count($v)-1;
}else if($isset_tel == true && count($v) <= 1){ // 当工作表中数据为0时
$ee['count'] = 0;
}
$saveFile_url_all[] = $inputFileName; // 所有的新文件生成地址 全路径
$saveFile_name_all[] = $ee; // 所有的新文件生成地址 仅文件名
}
// 创建生成压缩包
// $arr = [
// 'F:\phpstudy_pro\WWW\\tp5\public\static\girl.jpg'
// ];
//生成压缩文件名
$zipName = ROOT_PATH."/public/dmp_excel_upload/".date('Ymd').".zip";
$res = $this->createZipFiles($saveFile_url_all,$zipName);
$zipName_html = date('Ymd').".zip"; // 页面进行下载的地址
// halt($res); // halt
// 前台页面显示
$response = array(
'code' => '1',
'file' => $saveFile_url_all,
'file_name' =>$saveFile_name_all, // 包含文件名,和 count($arr)
'receive_file' => $filename, // 原文件名
'zip_url'=> $zipName_html,
'excel_num_all'=> $excel_num_all, // 原excel统计数量
'count_all'=> $count_all, // 生成excel 统计数量
'msg'=>'导出成功'
);
return json_encode($response);
}
//压缩文件成zip格式
function createZipFiles($pathArr,$zipName)
{
$zip = new \ZipArchive();
if($zip->open($zipName,\ZipArchive::CREATE|\ZipArchive::OVERWRITE)){
foreach($pathArr as $file){
if(!file_exists($file)){
continue;
}
$zip->addFile($file,basename($file)); //向压缩包中添加文件
}
$zip->close();
return ['code'=>1,'info'=>"创建成功",'path'=>$zipName];
}else{
return ['code'=>0,'info'=>'创建失败'];
}
}
页面中
<div class="layui-btn-container">
<button type="button" class="layui-btn" id="test3"><i class="layui-icon"></i>上传文件</button>
</div>
<a href="" id="links" > 下载excel </a >