PHP tp5.0使用Spreadsheet 实现excel导出功能

首先 你需要使用composer 去镜像上拉去spreadsheet
在composer.josn中添加
PHP tp5.0使用Spreadsheet 实现excel导出功能_第1张图片
在cmd中执行 composer update命令 从镜像中拉取Spreadsheet的文件包
这些准备工作完成后我们就一起来实现导出功能吧

首先你要从数据表中查到你想要的数据字段 有几个字段就代表你需要几列(这个一定要算好
不多说了 直接上代码比较直观 我会客观的讲解每一段的含义

// 导出商家列表
public function excelStore()
{
    ini_set('memory_limit', '-1');
    // 读取数据到数组
    $list = Db::name('store')->field('name,account,amount')
        ->where('status', 1)
        ->select();
    if (empty($list)) {
        $this->error = '没有数据';
        return false;
    }
  
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    // 设置工作表标题名称
    $sheet->setTitle('商家数据表');
    // 表头
    // 设置单元格内容
    $sheet->setCellValueByColumnAndRow(1, 1, '商家数据表');   //第一个参数代表列 第二个参数代表行  第三个参数代表表格里的内容
    $sheet->setCellValueByColumnAndRow(1, 2, '名称');
    $sheet->setCellValueByColumnAndRow(2, 2, '账号');
    $sheet->setCellValueByColumnAndRow(3, 2, '会员卡余额');

    // 设置列宽
    $sheet->getColumnDimension('A')->setWidth(20);       
    $sheet->getColumnDimension('B')->setWidth(20);
    $sheet->getColumnDimension('C')->setWidth(20);

    $sheet->mergeCells('A1:E1');   //合并单元格   从第一行的A 一直合并到第一行的E 
     
     //设置字体样式  不多说   自行脑补  
    $styleArray = [
        'font' => [
            'bold' => true
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER
        ]
    ];
    // 设置单元格样式
    $sheet->getStyle('A1')
        ->applyFromArray($styleArray)
        ->getFont()
        ->setSize(28);    

    $sheet->getStyle('A2:E2')
        ->applyFromArray($styleArray)
        ->getFont()
        ->setSize(14);
       //第一行是表头 第二行是字段 所以我们的数据要从第三行开始循环加入
    $row_num = 3; // 初始行
    foreach ($list as $row) {
        $sheet->getStyle('A' . $row_num)   
            ->getAlignment()
            ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);     // 居左显示                                                      
        $sheet->getStyle('A' . $row_num)
            ->getNumberFormat() 
            ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);   // 设置数字格式为文本
        $sheet->setCellValueExplicit('A' . $row_num, $row['name'], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); / 设置输入的数据为字符串, 避免被科学计数
        $sheet->setCellValueExplicit('B' . $row_num, $row['account'], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

        $sheet->setCellValueExplicit('C' . $row_num, $row['amount'], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
     //有几个字段就执行几次
        $row_num ++;
    }
    //生成表格
    $objWriter = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
           
    $save_path = config('upload.storexls'); //配置下载路径
    $filename = uniqid() . '.xlsx';    //文件名
    $abs_filepath = $save_path['savePath'] . $filename; // 文件绝对路径
    $show_path = $save_path['rootPath'] . $filename; // 下载相对路径

    $objWriter->save($abs_filepath);  //在该路径下保存生成好的表格文件

    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);

    return ajax_success('导出成功', [
        'url' => get_param(3) . $show_path    //把路径发给前端  让前端来做后续下载效果
    ]);
}

至此我们的导出功能已经实现完毕。有兴趣的小伙伴可以自己玩一下(只要excel的操作 都可以用代码实现 是不是很神奇)。

你可能感兴趣的:(PHP tp5.0使用Spreadsheet 实现excel导出功能)