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.基本就是这样,本人的实际代码和效果,大家复制以后修改下配置,基本就可以使用 ,

  希望大家喜欢!!!

posted @ 2021-05-14 15:28  金哥不是我  阅读(216)  评论(0)    收藏  举报