需求:
小程序端勾选订单后,点击导出订单,直接打开后台返回的excel文件(要求可以转发和保存到手机)
效果图:
需求分析:
- 点击导出订单时,请求接口,拿到返回的excel文件的网络地址(例:static.51dh.com.cn/yapei/30/84…
- 将网络文件转为本地文件后直接打开文档 代码实现 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);
}
})
}