PhpSpreadsheet之 ecxel通过某一列把内容拆分为多个新文件,并生成压缩包

引入

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 > 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值