php 小程序 导出excel文件

145 阅读2分钟

需求:
小程序端勾选订单后,点击导出订单,直接打开后台返回的excel文件(要求可以转发和保存到手机)
效果图:

需求分析:

  1. 点击导出订单时,请求接口,拿到返回的excel文件的网络地址(例:static.51dh.com.cn/yapei/30/84…
  2. 将网络文件转为本地文件后直接打开文档 代码实现 1.php代码,使用函数PHPExcel生成excel文件,将文件放到本地后上传网络
/**
 * @desription 下载excel
 * @date 2022/6/24 9:11
 * @author lvnn
 * @modified_date 2022/6/24 9:11
 * @modified_user lvnn
 */
public function actionDownloadExcel()
{
    try {
        if (!\Yii::$app->request->isPost) {
            throw new \Exception('请求方式不合法');
        }

        if (!isset($this->_params['group_ids']) || empty($this->_params['group_ids'])) {
            throw new \Exception('请求参数缺失,无法操作');
        }

        /* 实例化类 */
        $objPHPExcel = new \PHPExcel();
        /* 设置输出的excel文件为2007兼容格式 */
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
        /* 设置当前的sheet */
        $objPHPExcel->setActiveSheetIndex(0);
        $objActSheet = $objPHPExcel->getActiveSheet();

        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(23);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(23);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(45);
        $objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('R')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('S')->setWidth(35);


        $file_name = '团购订单';
        $objActSheet->setTitle('团购订单');
        $objActSheet->setCellValue('A1', '订单号');
        $objActSheet->setCellValue('B1', '支付商户号');
        $objActSheet->setCellValue('C1', '开团编号');
        $objActSheet->setCellValue('D1', '开团名称');
        $objActSheet->setCellValue('E1', '团长名称');
        $objActSheet->setCellValue('F1', '团长手机号');
        $objActSheet->setCellValue('G1', '所属经销商');
        $objActSheet->setCellValue('H1', '所属服务商');
        $objActSheet->setCellValue('I1', '下单时间');
        $objActSheet->setCellValue('J1', '支付时间');
        $objActSheet->setCellValue('K1', '实际支付金额');
        $objActSheet->setCellValue('L1', '下单人');
        $objActSheet->setCellValue('M1', '下单人手机号');
        $objActSheet->setCellValue('N1', '收件人');
        $objActSheet->setCellValue('O1', '收件人地址');
        $objActSheet->setCellValue('P1', '收件人手机号');
        $objActSheet->setCellValue('Q1', '下单瓶数');
        $objActSheet->setCellValue('R1', '订单状态');
        $objActSheet->setCellValue('S1', '订单备注');
        $i = 2;

        $params = [
            'BulkGroupOrderSearch'=>[
                'group_id'=>explode(',',$this->_params['group_ids'])
            ]
        ];
        $searchModel = new BulkGroupOrderSearch();
        $dataProvider = $searchModel->search($params);
        $query = $dataProvider->query->all();

        if (!empty($query)) {
            foreach ($query as $val) {
                $objActSheet->setCellValue('A'.$i, $val['order_code']);
                $objActSheet->setCellValue('B'.$i, $val['pay_code']);
                $objActSheet->setCellValue('C'.$i, "\t".$val['group_id']);
                $objActSheet->setCellValue('D'.$i, $val['group_name']);
                $objActSheet->setCellValue('E'.$i, $val['colonel_name']);
                $objActSheet->setCellValue('F'.$i, "\t".$val['colonel_phone']);
                $objActSheet->setCellValue('G'.$i, $val['company_name']);
                $objActSheet->setCellValue('H'.$i, $val['channel_name']);
                $objActSheet->setCellValue('I'.$i, $val['create_time']);
                $objActSheet->setCellValue('J'.$i, $val['pay_time']);
                $objActSheet->setCellValue('K'.$i, $val['pay_price']);
                $objActSheet->setCellValue('L'.$i, $val['nick_name']);
                $objActSheet->setCellValue('M'.$i, "\t".$val['phone']);
                $objActSheet->setCellValue('N'.$i, $val['consignee']);
                $objActSheet->setCellValue('O'.$i, $val['address_detail'].$val['address'].$val['house_number']);
                $objActSheet->setCellValue('P'.$i, "\t".$val['con_phone']);
                $objActSheet->setCellValue('Q'.$i, "\t".$val['total_num']);
                $objActSheet->setCellValue('R'.$i, BulkGroupOrderEnums::orderStatusList($val['order_status']));
                $objActSheet->setCellValue('S'.$i, $val['order_remark']);

                $i++;
            }
        }else{
            throw new \Exception('暂无数据可导出!');
        }

        $extension = '.xlsx';
        $destination_folder = Yii::$app->basePath . '/web/upload/'; //上传文件路径
        $file_name = $destination_folder . time() . rand(1111, 9999) . $extension; //文件名称
        //关键代码是这个,平常用的都是直接输出到屏幕,这是用到了save()方法
        $objWriter->save($file_name);
        //f_remote_upload()是封装的上传文件功能
        $file_url = f_remote_upload($file_name);
        if (empty($file_url)) {
            throw new \Exception('远程服务器上传失败!');
        }
        //返回网络文件地址
        $data = IMAGE_URL.'/'.$file_url;
        return returnArray('success', 1,$data);
    } catch (\Exception $e) {
        $err = $e->getMessage();
        return returnArray($err);
    }

}

2.小程序代码,使用wx.downloadFile()将接口返回的网络文件下载到本地,使用wx.openDocument()直接打开本地文件

 //下载excel
  download:function(){
    let _this = this,{
      num,
      groupList
    }=_this.data,ids=[];
    if(num<=0){
      return false;
    }
    groupList.forEach(function(i,index){
      if(groupList[index].curcho){
        ids.push(groupList[index].group_id)
      }
    })
    ids = ids.join(',');
    
    ajax.httpReq('/bulk-colonel/download-excel', 'post', {
      group_ids:ids
    }, true, '加载中').then(function (res) {
      console.log(res);
      if (res.result.code == 1) {
        // _this.closeModal();
        let file = res.result.data;
        wx.downloadFile({
          url: file,
          success(res) {
            wx.openDocument({
              filePath: res.tempFilePath,
              showMenu:true,
              success:function(res){
                console.log(res,'打开文档成功')
              }
            })
          }
        });
      } else {
        util.toolsFn.toastMsg(res.result.msg);
      }
    })
  }