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

news2024/12/26 0:59:08

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

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

效果如图:

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

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

composer require phpoffice/phpspreadsheet

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

<?php

require './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.coloradmin.cn/o/820794.html

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

相关文章

【Linux命令200例】rm用来删除文件或目录(谨慎使用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

1.3 网络空间安全政策与标准

数据参考&#xff1a;CISP官方 目录 网络安全国家战略网络安全标准体系网络安全等级保护网络安全职业道德 一、网络安全国家战略 1、国家指导政策 《中华人民共和国网络安全法》&#xff1a;该法律于2016年出台&#xff0c;2017年6月1日正式生效。它是中国网络安全领域的基…

Kylin v10基于cephadm工具离线部署ceph分布式存储

1. 环境&#xff1a; ceph&#xff1a;octopus OS&#xff1a;Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…

基于Spring Boot的美食分享网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的美食分享网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot…

数控机床主轴品牌选择及选型,如何维护和保养?

数控机床主轴品牌选择及选型&#xff0c;如何维护和保养&#xff1f; 数控机床是一种高精度、高效率、高自动化的机床。其中&#xff0c;主轴是数控机床的核心部件&#xff0c;承担着转动工件、切削加工的任务&#xff0c;决定了加工的转速、切削力度和加工效率。因此&#xff…

C++入门教程||C++地图用法

C地图用法 C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的&#xff0c;如下图&#xff1a;每一对中的第一个值称之为关键字&#xff08;key&#xff09;&#xff0c;每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。在一些程序中建立一…

最难用的鼠标键、设置半天、反人类逻辑(罗技)

目的&#xff1a;高效设置罗技鼠标键&#xff0c;提高复制粘贴效率 准备软件&#xff1a;Logitech G HUB – Logitech 支持 下载 1、右上角&#xff0c;点击箭头、点击管理配置文件 2、左下角、点击加号&#xff0c;创建配置文件“办公” 3、点击办公 4、右上角选择“办公”…

蓝桥云课ROS机器人旧版实验报告-01入门

项目名称 实验一 ROS[Kinetic/Melodic/Noetic]入门 成绩 设计要求&#xff1a; 机器人操作系统安装、虚拟机、Docker、嵌入式系统 实验记录&#xff08;70分&#xff09; 1.以 $ 开头的行是终端命令。 - 要打开一个新终端 → 使用快捷键 ctrlaltt。 - 要在现有终端内…

Mac端口扫描工具

端口扫描工具 Mac内置了一个网络工具 网络使用工具 按住 Command 空格 然后搜索 “网络实用工具” 或 “Network Utility” 即可 域名/ip转换Lookup ping功能 端口扫描 https://zhhll.icu/2022/Mac/端口扫描工具/ 本文由 mdnice 多平台发布

生成测试报告就万事大吉了吗?NO,升职加薪就差这一步啦!- 04(非常详细,非常实用)

简介 上一篇生成测试报告&#xff0c;小伙伴们和童鞋们就又问道&#xff0c;测试报告已经生成了&#xff0c;怎么发送给相关的负责人了&#xff1f;小伙伴们和童鞋们不要着急&#xff0c;慢慢给你道来&#xff0c;心急吃不了热豆腐哈。这些小伙伴们的表现还是不错的&#xff0c…

光学捕捉怎么选择数据手套?

数据手套是通过在vr手套内置传感器&#xff0c;采集手部运动数据的硬件设备&#xff0c;通常应用于模拟仿真、虚拟现实交互、数字人动画制作等领域&#xff0c;随着创作者对动作捕捉精度要求越来越高&#xff0c;在使用光学捕捉中需要使用数据手套进行手指动作捕捉&#xff0c;…

前端技术Vue学习笔记--002

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、指令修饰符2、v-bind对于样式控制的增强2.1、v-bind对于样式控制的增强--class2.2、v-bind对于样式控制的增强--操作style 3、v-model应用于其他表单元素4、计算属性4.1、**computed计算属性 vs methods方法的区别**4.2、计…

使用IPSEC VPN实现隧道通信实验

目录 1、首先为各个接口配置ip&#xff08;如图中&#xff09; 2、实现公网互通 3、测试是否全网互通 4、R1配置 5、R3配置 6、测试 IPSEC介绍&#xff1a;ipsec是一种基于网络层&#xff0c;应用密码学的安全通信协议簇&#xff0c;目的是在网络层环境ipv4,ipv6提供灵活的…

Spark提交流程

客户端通过脚本将任务提交到yarn执行&#xff0c;yarn启动APPMaster&#xff0c;APPMaster启动Driver线程&#xff0c;Driver负责初始化SparkContext并进行任务的切分和分配任务&#xff0c;交给Executor进行计算。

成就、对话、展望 | 浙江省饭店风云大会暨协会成立20周年庆典隆重召开

2023年7月30日-31日&#xff0c;由浙江省饭店业协会主办&#xff0c;浙江金华君澜大饭店协办的浙江省饭店风云大会暨协会成立20周年庆典在浙江金华君澜大饭店召开。浙江省各地饭店人、合作商、旅游院校代表、获奖代表共计300余人参加大会&#xff0c;共贺浙江省饭店业协会成立2…

unittest单元测试框架使用技巧

这里我们将要用的unittest是python的单元测试框架&#xff0c;它的官网是 25.3. unittest — Unit testing framework — Python 2.7.18 documentation&#xff0c;在这里我们可以得到全面的信息。 当我们写的用例越来越多时&#xff0c;我们就需要考虑用例编写的规范与组织&a…

npm -v无法显示版本号

情况&#xff1a; 删除C盘下.npmrc文件后解决。路径 C:\Users\Dell 记录一下这个解法。

maven下载按照及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 依赖Java&#xff0c;需要配置JAVA_HOME设置MAVEN自身的运行环境&#xff0c;需要配置MAVEN_HOME测试环境配置结果 MVN测试成功&#xff01;&#xff01;&#xff01; 二、本地仓库配置 Maven启动后&#xff0c;会自动保…

Devops系统中jira平台迁移

需求:把aws中的devops系统迁移到华为云中,其中主要是jira系统中的数据迁移,主要方法为在华为云中建立一套 与aws相同的devops平台,再把数据库和文件系统中的数据迁移,最后进行测试。 主要涉及到的服务集群CCE、数据库mysql、弹性文件服务SFS、数据复制DRS、弹性负载均衡ELB。 迁…

闲置资源优化,轻松检查集群中的空闲成本

作者&#xff1a;梁成昊&#xff08;景祁&#xff09; 前言 Kubernetes 提供了对计算、网络、存储资源的抽象&#xff0c;提升了集群资源管理的效率。然而&#xff0c;由于用户不需要直接管理底层资源&#xff0c;可能导致部分闲置资源未及时发现&#xff0c;造成成本浪费。在…