晓夏

北漂的女孩

Good Luck To You!

php+Spreadsheet导出多个sheet

浏览量:173

产品需求让一键导出多个sheet,脑子里面立马想到了PhpOffer

<?php
namespace app\count\logic;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

/**
 * 按照不同的条件导出
 * @param $data
 * auth:lianghuiju@aocyun.com
 * time:2021/6/3 17:39
 */
public function getExportCountExcel(){
    $exportRes = array(
        'campusList'=>array(
            "0"=>array(
                'CampusName'=>'学校',
                'PreviewTimes'=>'500',
                'DateTime'=>'20210610'
            ),
            "1"=>array(
                'CampusName'=>'学校1',
                'PreviewTimes'=>'500',
                'DateTime'=>'20210610'
            ),
        ),
        'classList'=>array(
            "0"=>array(
                'CampusName'=>'校区1',
                'ClassName'=>'班级1',
                'LookBackTotal'=>'34'
            ),
            "1"=>array(
                'CampusName'=>'校区2',
                'ClassName'=>'班级2',
                'LookBackTotal'=>'8'
            ),
        )
    );   
    $this->dataAll($exportRes);
}

/**
 * 格式化标准数据并导出
 * @param $data
 * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
 * auth:lianghuiju
 * time:2021/6/7 18:32
 */
public function dataAll($data){
    $lastArr = [];
    $num = count($lastArr);
    if(isset($data['campusList'])){
        $lastArr[$num]['title'] = "机构数据";
        $lastArr[$num]['rows'][0] = ['学校名称','预习平均使用时长','学习日期'];
        $i = 1;
        foreach ($data['campusList'] as $key =>$value){
          $lastArr[$num]['rows'][$i++]=[$value['CampusName'],$value['PreviewTimes'],$value['DateTime']];
        }
    }
    $num = count($lastArr);
    if(isset($data['classList'])){
        $lastArr[$num]['title'] = "校区数据";
        $lastArr[$num]['rows'][0] = ['学校名称','班级名称','预习平均使用时长'];
        $i = 1;
        foreach ($data['classList'] as $value){
          $lastArr[$num]['rows'][$i++]=[$value['CampusName'],$value['ClassName'],$value['LookBackTotal']];
        }
    }
    $this->xtexport($lastArr);
}

/**
 * 数据导出
 * @param $data_array
 * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
 * auth:lianghuiju
 * time:2021/6/7 18:15
 */
public  function xtexport($data_array)
{
    $name = '学习统计' . date("Y-m-d", time());
    $spreadsheet = new Spreadsheet();
    foreach ($data_array as $key => $data) {
        $this->opSheet($spreadsheet,$key,$data);
    }
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
    header('Cache-Control: max-age=0');
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
    $spreadsheet->disconnectWorksheets();//删除清空:
    unset($spreadsheet);
    exit;
}

/**
 * 数据填充到excel
 * @param $spreadsheet
 * @param $n
 * @param $data
 * auth:lianghuiju
 * time:2021/6/7 18:30
 */
private function opSheet($spreadsheet,$n, $data){
    $spreadsheet->createSheet();//创建sheet
    $spreadsheet->setActiveSheetIndex($n);//设置当前的活动sheet
    $keys = $data['rows'][0];//这是你的数据键名
    $count = count($keys);//计算你所占的列数
    $infoStart =  1 ;//下面的详细信息的开始行数
    $sheet = $spreadsheet->getActiveSheet($n)->setTitle($data['title']);//设置sheet的名称
    foreach ($data['rows'] as $key => $item) {
        for ($i = 65; $i < $count + 65; $i++) {
            $sheet->setCellValue(strtoupper(chr($i)) . ($key+"$infoStart"), $item[$i - 65]);
        }
    }
}








神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。