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();
$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号