PHP--文件导出
1. 使用的扩展是 phpoffice/phpspreadsheet , 首先 composer 安装
composer require phpoffice/phpspreadsheet
2. 闲话少说,关键部分,直接上实例代码
public function cashLogExport(GetLogPageListRequest $request) { $now_data = date('Y-m-d H:i:s', time()); $last_data = date('Y-m-d H:i:s', strtotime("-6 month")); $begin_time = (string)$request->input('begin_time'); $end_time = (string)$request->input('end_time'); $order_id = (string)$request->input('order_id'); // 母订单号 搜索 $sub_order_id = (string)$request->input('sub_order_id'); // 子订单号 搜索 $supplier_name = (string)$request->input('supplier_name'); //供应商 搜索 if(empty($begin_time) && empty($end_time) && empty($order_id) && empty($sub_order_id) && empty($supplier_name)){ $begin_time = $last_data; $end_time = $now_data; // 条件全空时 默认 半年时间 } $newExcel = new Spreadsheet(); $objSheet = $newExcel->getActiveSheet();
// 长度超出15位时,会转译 比如订单编号 设置单元格 或者在数据前面加空格
// ->getCell('H2')
// ->setValueExplicit(
// '25',
// \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_INLINE
// )
$objSheet->setTitle('财务概况'); // 按自己的逻辑,获取数据 此处代码方法省略 $info = $this->infoExport($begin_time, $end_time, $order_id, $sub_order_id, $supplier_name); if(empty($info)){ ApiException::break('60010|未查询到符合条件的信息'); } $title = ['序号', '财务变动类型', '供货价/元', '商城价/元', '目标供应商', '订单编号', '子单号', '交易时间']; //表头 //设置单元格内容 foreach ($title as $key => $value) { $objSheet->setCellValueByColumnAndRow($key + 1, 1, $value); } $row = 2; //从第二行开始 foreach ($info as $item) { $column = 1; $row_data = array(); $row_data[0] = $item['cash_id']; $row_data[1] = $item['change_name']; $row_data[2] = $item['cost_price'] / 100; $row_data[3] = $item['selling_price'] / 100; $row_data[4] = $item['supplier_name']; $row_data[5] = $item['order_id']; $row_data[6] = $item['sub_order_id']; $row_data[7] = $item['create_time']; foreach ($row_data as $value) { $objSheet->setCellValueByColumnAndRow($column, $row, $value); $column++; } $row++; } $fileName = 'Export.' . date('Ymdhis', time()); // 文件名 // $fileType = 'Xlsx'; // $this->excelBrowserExport($fileName, $fileType); $writer = IOFactory::createWriter($newExcel, 'Xlsx'); $savePath = $fileName . '.Xlsx'; $writer->save($savePath); // 异步就用 阿里云上传,否则省略此步骤 按域名路径返回文件url 即可 $fin_over_model = new ShpFinancialOverview(); // 写在我一个model中的oss上传方法 $oss_up_file_url = $fin_over_model->ossupfile($savePath); // 删除本地文件 if (file_exists($savePath)) { unlink($savePath); } return $this->response->apiSuccess($oss_up_file_url); }
public function ossupfile($file) { //接收上传文件 $result = []; if ($file) { //调用阿里云OSS上传 $res = self::AliuploadFile('export', $file); return $res; } $result['code'] = 0; $result['msg'] = '没有上传文件'; return $result; }
3. 下方的阿里云oss上传使用的是 STS token验证的方式,不懂的去看官方文档,此处不做多解释
public function AliuploadFile($module, $file) { //获取OSS参数值 $KeyId = env('ALI_ACCESS_KEY_ID'); $KeySecret = env('ALI_ACCESS_SECRET'); $EndPoint = env('ALI_OSS_ENDPOINT_HOST'); $Bucket = env('ALI_OSS_BUCKET'); $ROLE_ARN = env('ALI_ROLE_ARN'); $ROLE_SESSION_NAME = env('ALI_ROLE_SESSION_NAME'); // 以 ossSTS 方式 上传文件 //先获取 securityToken $sts_token = $this->getSTSToken($KeyId, $KeySecret, $ROLE_ARN, $ROLE_SESSION_NAME); if (!isset($sts_token['Credentials']['SecurityToken']) || empty($sts_token['Credentials']['SecurityToken'])) { return ['code' => 500, 'msg' => 'STStoken获取失败,请稍后重试', 'data' => '']; } try { // 使用STStoken之后的 Keyid,Secret $KeyId = $sts_token['Credentials']['AccessKeyId']; $KeySecret = $sts_token['Credentials']['AccessKeySecret']; //实例化 $ossClient = new OssClient( $KeyId, $KeySecret, $EndPoint, false, $sts_token['Credentials']['SecurityToken'] ); //sha1加密 生成文件名 连接后缀 $fileName = $module . '/' . sha1(date('YmdHis', time()) . uniqid()) . '.Xlsx'; //执行阿里云上传 $result = $ossClient->uploadFile($Bucket, $fileName, $file); //图片地址:$result['info']['url'] $arr = ['code' => 10000, 'msg' => '上传成功', 'data' => $result['info']['url']]; } catch (OssException $e) { $arr = ['code' => 500, 'msg' => $e->getMessage(), 'data' => '']; } return $arr; }
//获取 securityToken public function getSTSToken($KeyId, $KeySecret, $ROLE_ARN, $ROLE_SESSION_NAME) { //构建一个阿里云客户端,用于发起请求。 //构建阿里云客户端时需要设置AccessKey ID和AccessKey Secret。 AlibabaCloud::accessKeyClient($KeyId, $KeySecret) ->regionId('cn-hangzhou') ->asDefaultClient(); //设置参数,发起请求。 try { $result = AlibabaCloud::rpc() ->product('Sts') ->scheme('https') // https | http ->version('2015-04-01') ->action('AssumeRole') ->method('POST') ->host('sts.aliyuncs.com') ->options( [ 'query' => [ 'RegionId' => "cn-hangzhou", 'RoleArn' => "$ROLE_ARN", 'RoleSessionName' => "$ROLE_SESSION_NAME", ], ] ) ->request(); return $result->toArray(); } catch (ClientException $e) { return $e->getErrorMessage() . PHP_EOL; } catch (ServerException $e) { return $e->getErrorMessage() . PHP_EOL; } }
4. 然后导出的文件内容就是下图的样子

5.基本就是这样,本人的实际代码和效果,大家复制以后修改下配置,基本就可以使用 ,
希望大家喜欢!!!

浙公网安备 33010602011771号