PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表   需要支持下拉   且 还需要支持三级联动功能 

目前应为PHPExcel 不在维护,固采用 PhpSpreadsheet

效果如图:

 第一步:首先 使用composer 获取PhpSpreadsheet

我这里PHP 版本 7.4  命令如下:

composer require phpoffice/phpspreadsheet

 第二步:新建php 文件 代码如下   可根据实际情况 自己改动:

<?phprequire './vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\NamedRange;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;// 定义表头
$header = [['col' => 'A', 'title' => '姓名', 'field' => 'name', 'width' => 20, 'id_down_type' => 0, 'is_text' => 1],['col' => 'B', 'title' => '证件号', 'field' => 'id_card', 'width' => 30, 'id_down_type' => 0, 'is_text' => 1],['col' => 'C', 'title' => '性别', 'field' => 'gender', 'width' => 20, 'id_down_type' => 1, 'is_text' => 1, 'count' => 2, 'sub_table_name' => 'sex'],['col' => 'D', 'title' => '联系方式', 'field' => 'phone', 'width' => 20, 'id_down_type' => 0, 'is_text' => 1],['col' => 'E', 'title' => '门店', 'field' => 'mendiao', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],['col' => 'F', 'title' => '公寓', 'field' => 'gongyu', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],['col' => 'G', 'title' => '门牌号', 'field' => 'menpai', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],
];// 下拉数据[这里模拟出来数据格式,实际情况从数据库获取数据并整理成下列数据格式]
$oneData = [['id' => 1,'title' => '我是A','text'=>'我是A_1','children' =>[['id' => 2,'title' => '我是A的下级A1','text'=>'我是A的下级A1_2','children' =>[['id' => 3,'title' => '我是A1的下级A11','text'=>'我是A1的下级A11_3',],['id' => 4,'title' => '我是A1的下级A12','text'=>'我是A1的下级A12_4',]]],['id' => 5,'title' => '我是A的下级A2','text'=>'我是A的下级A2_5','children' =>[['id' => 6,'title' => '我是A2的下级A21','text'=>'我是A2的下级A21_6',],['id' => 7,'title' => '我是A2的下级A22','text'=>'我是A2的下级A22_7',]]]]],['id' => 8,'title' => '我是B','text'=>'我是B_8','children' =>[['id' => 9,'title' => '我是B的下级B1','text'=>'我是B的下级B1_9','children' =>[['id' => 10,'title' => '我是B1的下级B11','text'=>'我是B1的下级B11_10',],['id' => 11,'title' => '我是B1的下级B12','text'=>'我是B1的下级B12_11',]]],['id' => 12,'title' => '我是B的下级B2','text' => '我是B的下级B2_12','children' =>[['id' => 13,'title' => '我是B2的下级B21','text' => '我是B2的下级B21_13',],['id' => 14,'title' => '我是B2的下级B22','text' => '我是B2的下级B22_14']]]]],
];//实例化Spreadsheet对象
$spreadsheet = new Spreadsheet();$sex_list = [['id' => 1, 'text' => '男'],['id' => 2, 'text' => '女'],];
$sub_table_num = 1;  //子表顺序  默认1 
//创建子表下拉定义  用于下拉
$sub_table_info_arr = [['title' => 'sex', 'index' => $sub_table_num, 'data' => $sex_list],
];
$sub_table_num++;//创建下拉分表数据
create_excel_sub_table($spreadsheet, $sub_table_info_arr);//创建下拉联动分表数据 
$liandong_name = 'region';  // 这里的region为分表名称
create_excel_drop_down($spreadsheet, $sub_table_num, $liandong_name, $oneData);  //无限极oneData   里面结构为[['text'=>'部门1_00001','children'=>[['text'=>'部门1子集1_00001']]]// 初始化表头
$spreadsheet->setActiveSheetIndex(0);
$spreadsheet->getActiveSheet()->setTitle('导入模板');foreach ($header as $key => $value) {//$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($key, 1, $value['title']);$spreadsheet->setActiveSheetIndex(0)->setCellValue($value['col'] . "1", $value['title']);$spreadsheet->getActiveSheet()->getStyle($value['col'] . "1", $value['title'])->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED); //设置红色文字// 设置每列宽度$spreadsheet->getActiveSheet()->getColumnDimension($value['col'])->setWidth($value['width']);//设置单元格格式为文本if ($value['is_text'] == 1) {$spreadsheet->getActiveSheet()->getStyle($value['col'])->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);}
}
$objActSheet = $spreadsheet->getActiveSheet();// 输出下拉菜单
for ($i = 2; $i < 2000; $i++) {foreach ($header as $key1 => $value1) {//$this->set_select_cell($objActSheet,'A','id_type',$key,$i);if ($value1['id_down_type'] == 1) {//单纯下拉set_select_cell($objActSheet, $value1['col'], $value1['sub_table_name'], $value1['count'], $value1['title'], $i);} elseif ($value1['id_down_type'] == 2) {//联动下拉if ($value1['col'] == 'A' || $value1['col'] == 'E' || $value1['col'] == 'AC') {switch ($value1['col']) {case 'E':$fit_col = ['F','G'];break;case 'AC'://这里为关联 如AC 列  关联AD AE 这个$fit_col = ['AD', 'AE'];break;}$mian_col = $value1['col'];//处理联动下拉set_drop_down_select_cell($objActSheet, $mian_col, $fit_col, $value1['title'], $i,$liandong_name);}}}
}
$path = "./";
$subject = "导出模板".date('YmdHis');
$ext = ".xlsx";  //后缀
$export = $path . $subject . $ext;
$writer = new Xlsx($spreadsheet);
//保存文件
$writer->save($export);
//关闭连接,销毁变量
$spreadsheet->disconnectWorksheets();unset($spreadsheet);
var_dump($export);
die;/*** 创建Excel 分表* @param obpe Excel 对象* @param sub_table_info_arr  需要需要创建的分表二维数组   key title_name 分表表名标题    key index 分表顺序  key data 数据源  且数据源必须为 id text 键值对* @param write_data 写入的数据    二维  包含 id text 两个键值*/
function create_excel_sub_table($obpe, $sub_table_info_arr)
{if (!empty($sub_table_info_arr)) {foreach ($sub_table_info_arr as $key => $value) {$obpe->createSheet();$obpe->setActiveSheetIndex($value['index']);  //设置序号$obpe->getActiveSheet()->setTitle($value['title']); //设置表名$obpe->getActiveSheet()->setSheetState(Worksheet::SHEETSTATE_HIDDEN); //隐藏//密码$obpe->getActiveSheet()->getProtection()->setPassword('PHPExcel');$obpe->getActiveSheet()->getProtection()->setSheet(true);// This should be enabled inorder to enable any of thefollowing!$obpe->getActiveSheet()->getProtection()->setSort(true);$obpe->getActiveSheet()->getProtection()->setInsertRows(true);$obpe->getActiveSheet()->getProtection()->setFormatCells(true);$key = 1;if (!empty($value['data'])) {foreach ($value['data'] as $k => $v) {$str = $v['text'] . '_' . $v['id'];$obpe->getActiveSheet()->setCellValue('A' . $key, $str);$key++;}}}}
}/*** 生成Excel 列* @param int $num 需要的列数* @return array*/function  getExcelIndexRow($num=1){$r = [];$idx = ['idx' => 0];for ($i = 0; $i < $num; $i++) {$r[] =  getNextIdx($idx);}unset($idx);return $r;
}function getNextIdx(&$idx) {// 先转换26进制$num26 = base_convert($idx['idx'], 10, 26);$result = '';// 对每一位进行字符转换for ($i = 0; $i < strlen(strval($num26)); $i++) {if ($i == 0 && strlen(strval($num26)) != 1) {if (is_numeric($num26[$i])) {$result.= chr(ord($num26[$i]) + 16);} else {$result.= chr(ord($num26[$i]) - 23);}} else {if (is_numeric($num26[$i])) {$result.= chr(ord($num26[$i]) + 17);} else {$result.= chr(ord($num26[$i]) - 22);}}}$idx['idx'] = $idx['idx'] + 1;return $result;
}/***生成Excel 联动下拉* @param obpe Excel对象句柄* @param sub_table_num 分表序号* @param table_name 分表名称* @param data_source 需要处理的数据源*/
function create_excel_drop_down($obpe, $sub_table_num, $table_name, $data_source)
{//***********************$obpe->createSheet();$obpe->setActiveSheetIndex($sub_table_num);$obpe->getActiveSheet()->setTitle($table_name);$obpe->getActiveSheet()->setSheetState(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN); //隐藏//密码$obpe->getActiveSheet()->getProtection()->setPassword('PHPExcel');$obpe->getActiveSheet()->getProtection()->setSheet(true);// This should be enabled inorder to enable any of thefollowing!$obpe->getActiveSheet()->getProtection()->setSort(true);$obpe->getActiveSheet()->getProtection()->setInsertRows(true);$obpe->getActiveSheet()->getProtection()->setFormatCells(true);$key = 1;//$col = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ', 'BA'];//这里定义1000个下拉  若超过 1000个下拉 异常输出$col = getExcelIndexRow(1000);$high = 0;//数据源格式必须按照以下格式规整 要不然数据处理出错/*$re = [['name'=>'湖北省','children'=>[['name'=>"武汉市",'children' =>['江夏区','洪山区','青山区','武昌区']],['name'=>"宜昌市",'children' =>['江夏区1','洪山区1','青山区1','武昌区1']],['name'=>"荆州市",'children' =>['江夏区2','洪山区2','青山区2','武昌区2']]]],['name'=>'湖南省','children'=>[['name'=>"长沙市",'children' =>['长沙市','长沙市1','长沙市3','长沙市6']],['name'=>"岳阳市",'children' =>['岳阳市4','岳阳市3','岳阳市2','岳阳市1']],[ 'name'=>"常德市",'children' =>['常德市1','常德市2','常德市3','常德市4']]]],];*/foreach ($data_source as $k => $v) {$str = $v['text'];$obpe->getActiveSheet()->setCellValue($col[0] . ($key + $high), $str);$max = 0; // 重置max$secondNum = count($v['children']);if (!empty($v['children'])) {foreach ($v['children'] as $index => $sendcond) {$obpe->getActiveSheet()->setCellValue($col[$index + 1] . ($key + $high), $sendcond['text']);//这里需要处理  若没有if (isset($sendcond['children']) && $sendcond['children']) {$thirdNum = count($sendcond['children']);} else {$thirdNum = 0;}if ($thirdNum > $max) {$max = $thirdNum;}if (!empty($sendcond['children'])) {foreach ($sendcond['children'] as $id => $third) {//$obpe->getActiveSheet()->setCellValue($col[$index+1].($key+$high+$id+1),$third);$obpe->getActiveSheet()->setCellValue($col[$index + 1] . ($key + $high + $id + 1), $third['text']);}//定义三级名称$obpe->addNamedRange(new NamedRange($sendcond['text'],$obpe->getSheetByName($table_name),$col[$index + 1] . ($key + $high + 1) . ':' . $col[$index + 1] . ($key + $high + 1 + $thirdNum - 1)));}}//定义二级$obpe->addNamedRange(new NamedRange($v['text'],$obpe->getSheetByName($table_name),$col[1] . ($key + $high) . ':' . $col[$secondNum] . ($key + $high)));}$high += $max;$key++;}//移花foreach ($data_source as $var => $cont) {$obpe->getSheetByName($table_name)->setCellValue('UI' . ($var + 1), $cont['text']);}$total = count($data_source);$n = 1;$obpe->addNamedRange(new NamedRange($table_name,$obpe->getSheetByName($table_name),"=\$UI\${$n}:\$UI\${$total}"));
}/***设置Excel  下拉 2020年8月4日16:02:09* @param objActSheet Excel对象句柄* @param col         操作的列* @param table_name  Excel电子薄分表下拉名称*/
function set_select_cell($objActSheet, $col = '', $table_name, $key = '', $setPromptTitle, $i = '', $setErrorTitle = '输入的值有误', $setError = '您输入的值不在下拉列表内')
{$objValidation = $objActSheet->getCell("{$col}" . $i)->getDataValidation();$objValidation->setType(DataValidation::TYPE_LIST)// ->setErrorStyle(DataValidation::STYLE_INFORMATION)->setErrorStyle(DataValidation::STYLE_STOP)->setAllowBlank(true)->setShowInputMessage(true)->setShowErrorMessage(true)->setShowDropDown(true)->setErrorTitle('输入的值有误')->setError('您输入的值不在下拉列表内')->setPromptTitle("{$setPromptTitle}(在列表内选择)")->setPrompt('请从列表中选择一个值')->setFormula1($table_name . '!$A$1:$A$' . $key);
}/*** 设置联动下拉的Excel 渲染 2020年8月8日20:23:39* @param objActSheet Excel对象句柄* @param mian_col    联动下拉第一列* @param fit_col     数组   子下拉节点  setFormula1 依次为下拉第一列名   后续依次关联* @param setPromptTitle       中文字段映射名称*/
function set_drop_down_select_cell($objActSheet, $main_col, $fit_col, $setPromptTitle, $i,$main_table_name='region')
{$indirect_list_arr = $fit_col;  //从主下拉节点开始计算array_unshift($indirect_list_arr, $main_col);//定义主表名//处理主下拉$objValidation = $objActSheet->getCell($main_col . $i)->getDataValidation();$objValidation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP)->setAllowBlank(false)->setShowInputMessage(true)->setShowErrorMessage(true)->setShowDropDown(true)->setErrorTitle('输入的值有误')->setError('您输入的值不在下拉列表内')->setPromptTitle("{$setPromptTitle}(在列表内选择)")//->setPromptTitle("type_list(在列表内选择)")->setPrompt('请从列表中选择一个值')->setFormula1("={$main_table_name}");//处理分节点下拉if (!empty($fit_col)) {foreach ($fit_col as $key => $value) {$objValidation = $objActSheet->getCell($value . $i)->getDataValidation();$objValidation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP)->setAllowBlank(false)->setShowInputMessage(true)->setShowErrorMessage(true)->setShowDropDown(true)->setErrorTitle('输入的值有误')->setError('您输入的值不在下拉列表内')->setPromptTitle('请选择')->setPrompt('请从列表中选择一个值')->setFormula1('=INDIRECT($' . $indirect_list_arr[$key] . $i . ')');}}return true;
}

步骤三: 运行php   我这里使用命令行 

php index.php

 查看即可

就是如此简单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

富士通“Actlyzer”提供基于AI的基于视频的行为分析

想象一下这样的场景&#xff1a;一个男人走近一个家的前门&#xff0c;蹲下并检查钥匙孔。这是丢失房屋钥匙的居民还是客人&#xff1f;还是寻找入口点的窃贼&#xff1f;“Actlyzer”是一种新的人工智能安全系统&#xff0c;旨在区分这种情况。富士通实验室和研发中心的行为分…

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…

XtraBackup 8.0.33-28 prepare 速度提升 20 倍!

在这篇博文中&#xff0c;我们将描述 Percona XtraBackup 8.0.33-28 的改进&#xff0c;这显著减少了备份准备所需的时间&#xff0c;以便进行恢复操作。 Percona XtraBackup 中的这一改进显着缩短了新节点加入 Percona XtraDB 集群&#xff08;PXC&#xff09; 所需的时间。 …

Python - OpenCV识别条形码、二维码(已封装,拿来即用)

此代码可识别条形码和二维码&#xff0c;已封装好&#xff0c;拿来即用&#xff1a; import cv2 import pyzbar.pyzbar as pyzbar import numpy from PIL import Image, ImageDraw, ImageFontclass CodeScan():def __init__(self):super(CodeScan, self).__init__()def decode…

阿丹千问vue页面升级-使用Markdown形式展示回答--markdown-it库

阿丹&#xff1a; 在之前开发的阿丹千问 发现回复的文章格式使用 Markdown的格式。所以想使用Markdown的方式来给页面来个升级。 下面就是升级以及开发的过程。 升级思路 使用vue中的markdown-it库 在Vue页面中使用Markdown文档 安装markdown-it&#xff1a; 在Vue项目中…

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI+智能制造与机器人的现状与未来

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI智能制造与机器人的现状与未来 在过去的半年里&#xff0c;AI 相关技术取得了革命性突破&#xff0c;CSDN CMeet策划推出系列研讨会&#xff0c;深度探讨技术更新后的开发实践。然而&#xff0c;更重要的是如何对 AI 实…

设计模式:生成器模式

这个模式书上讲的比较简单&#xff0c;但是感觉精华应该是讲到了。 引用下其它博客的总结&#xff1a;生成器模式的核心在于分离构建算法和具体的构造实现&#xff0c;从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时&#xff0c;所有的报文都会被抓包。 我们在开发或测试时&#xff0c;只需要抓包某个域名下的报文 &#xff0c;以“www.baidu.com”为例&#xff0c;不设置过滤器&…

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能 App的应用图标通过3D Touch按压App图标&#xff0c;会显示快捷选项&#xff0c;点击选项可快速进入到App的特定页面。 这里用到了UIApplicationShortcutItem与UIMutableApplicationShortcutItem 一、效果图 这里…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现&#xff0c;以验证系统是否能够满足用户需求&#xff0c;同时发现潜在的性能问题并加以解决。 首先&#xff0c;性能压力测试对于确保系…

Linux端口与netstat使用

端口是设备与外界交流的通道&#xff0c;有物理端口和虚拟端口。 Linux有六万多端口&#xff0c;可以分为下面几类&#xff1a; 1.公认端口&#xff08;1~1023&#xff09;&#xff1a;用于系统内置与知名程序的预留使用 2.注册端口&#xff08;1024~49151&#xff09;&…

Games虚拟现实人本计算研究

晚上八点(北京时间)的 GAMES Webinar 《VR/AR专题》第二期即将开始&#xff01;&#x1f525;&#x1f525;&#x1f525; &#x1f4dc;本期主题&#xff1a;VR人本计算及交互 &#x1f468;&#x1f3fb;‍&#x1f3eb;嘉宾1&#xff1a;北京大学的李胜老师 &#x1f468;…

用python编写一个小程序,如何用python编写软件

大家好&#xff0c;给大家分享一下用python编写一个小程序&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、python可以写手机应用程序吗&#xff1f; 我想有人曲解意思了&#xff0c;人家说用python开发渣蔽一个手机app&#xff0c;不是…

让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应…

CNN、数据预处理、模型保存

目录 CNN代码读取数据搭建CNN训练网络模型 数据增强迁移学习图像识别策略数据读取定义数据预处理操作冻结resnet18的函数把模型输出层改成自己的设置哪些层需要训练设置优化器和损失函数训练开始训练再训练所有层关机了&#xff0c;再开机&#xff0c;加载训练好的模型 CNN 代码…

如何快速用Go获取短信验证码

要用Go获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff0…

【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】

文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…

力扣简单1道_两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序…

微信小程序开发学习之--地图绘制行政区域图

不知道大家有没有感觉就是在做微信小程序地图功能时刚刚接触时候真的感觉好迷茫呀&#xff0c;文档看不懂&#xff0c;资料找不到&#xff0c;就很难受呀&#xff0c;比如我现在的功能就想想绘制出一个区域的轮廓图&#xff0c;主要是为了显眼&#xff0c;效果图如下&#xff1…

【入门SpringCloud(一)】什么是SpringCloud?

一、概述 集群&#xff08;Cluster&#xff09;&#xff1a;同一种软件服务的多个服务节点共同为系统提供服务过程&#xff0c;称之为该软件服务集群。 分布式&#xff08;Distribute&#xff09;&#xff1a;分布式是一种系统架构&#xff0c;是将系统中的不同组件分布在不同…