EasyExcel模板填充以及填充多个sheet

# 一 需求:
有一个需求是根据不同维度去查询数据然后汇总,最后一行数据为合计数据,并且总计那行要合并单元格
# 二 思路
因为有7个维度,不想去写7个查询,然后分析之后发现只有汇总条件是可变的,其它数据一样
然后创建一个视图 在那个视图里汇总数据,后续就算改变字段啥的也方便
  以下是**部分关键代码**
```java
String nowDate = DateUtil.format(new Date(), "yyyy-MM-dd");
        String paramDate = DateUtil.format(vo.getDate(), "yyyy-MM-dd");
        int date = DateUtil.compare(DateUtil.parseDate(nowDate), DateUtil.parseDate(paramDate));
        String sql=null;
        if (vo.getStatisticDim().equals(DimensionEnum.UNITDIM.name())){
            //voList=baseMapper.queryStatisticByDim(vo);
            sql="t.construct_unit";
        }else if (vo.getStatisticDim().equals(DimensionEnum.PROMANAGEDIM.name())){
            vo.setConstructUnit(null);
            sql="t.discipline";
            //voList = baseMapper.queryByDimAndDiscipline(vo);
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITPROMANAGERDIM.name())){
            sql="t.construct_unit,t.project_implementation_manager_primary";
            //voList = baseMapper.queryByUNITPROMANAGERDIM(vo);
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITCITYCONSTRUCTDIM.name())){
            sql="t.construct_unit,t.district,t.construction_unit";
        }else if (vo.getStatisticDim().equals(DimensionEnum.PROVINCEPROMANAGERDIM.name())){
            vo.setConstructUnit(null);
            sql="t.project_management_manager_primary";
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITCONSTRUCTDIM.name())){
            sql="t.construct_unit,t.construction_unit";
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITPROCONSTRUCTDIM.name())){
            sql="t.construct_unit,t.construction_unit,t.project_name";
        }
        if (date<0){
            // // TODO: 2024/3/23  查历史数据
        }else {
            voList = baseMapper.queryByDimAndUnit(vo,sql);
        }
```

**xml**
```java
select rownum as index ,a.* from (
        select

        ${sql},
        sum(case when t.completion_report_completion_time is not null then 1 else 0 end) as videoFinishScale,
        sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time
        <![CDATA[ <= ]]> 10 and (t.acceptance_opinion <![CDATA[<>]]> '通过' or t.acceptance_opinion is null) then 1 else 0
        end) as videoTenunfinishScale,
        sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time
        <![CDATA[ <= ]]> 20 and (t.acceptance_opinion <![CDATA[<>]]> '通过' or t.acceptance_opinion is null) then 1 else 0
        end) as videoTwnunfinishScale,
        sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time
        <![CDATA[ <= ]]> 30 and (t.acceptance_opinion <![CDATA[<>]]> '通过' or t.acceptance_opinion is null) then 1 else 0
        end) as videoThiunfinishScale,
        sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time >
        30 and (t.acceptance_opinion <![CDATA[<>]]> '通过' or t.acceptance_opinion is null) then 1 else 0 end) as
        videoUnfinishScale,

        (sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time >
        30 and (t.acceptance_opinion <![CDATA[<>]]> '通过' or t.acceptance_opinion is null) then 1 else 0 end) /
        decode(sum(case when t.completion_report_completion_time is not null then 1 else 0 end),0,1,sum(case when
        t.completion_report_completion_time is not null then 1 else 0 end))) * 100 as videoUnfinishRate,


        sum(case when t.completion_report_completion_time is not null and sysdate-t.completion_report_completion_time >
        30 and t.acceptance_opinion = '通过' then 1 else 0 end) as videoUnfinishCount,
        sum(case when t.completion_report_completion_time is not null and t.acceptance_opinion = '通过' then 1 else 0 end)
        as videofinishCount,
        (sum(case when t.completion_report_completion_time is not null and t.acceptance_opinion = '通过' then 1 else 0
        end) / decode(sum(case when t.completion_report_completion_time is not null then 1 else 0 end),0,1,sum(case when
        t.completion_report_completion_time is not null then 1 else 0 end))) * 100 as videoRate,
        sum(case when t.acceptance_opinion = '通过' then 1 else 0 end) as videoCount,
        sum(case when t.acceptance_opinion = '通过' and (t.acceptance_failed_times = 0 or t.acceptance_failed_times is
        null) then 1 else 0 end) as videoPass
        from video_statistic_view t
        where 1=1<if test="vo.constructUnit != null and vo.constructUnit !='' ">and t.construct_unit in
        <foreach collection="vo.constructUnit" item="unit" open="(" separator="," close=")">
                #{unit}
            </foreach>
        </if>
        <if test="vo.projectImplementationManagerPrimary != null and vo.projectImplementationManagerPrimary != ''">
            and t.project_implementation_manager_primary like concat('%', #{vo.projectImplementationManagerPrimary},'%')
        </if>
        <if test="vo.district != null and vo.district != ''">
            and t.district like concat('%', #{vo.district},'%')
        </if>
        <if test="vo.constructionUnit != null and vo.constructionUnit != ''">
            and t.construction_unit like concat('%', #{vo.constructionUnit},'%')
        </if>
        <if test="vo.projectManagementManagerPrimary != null and vo.projectManagementManagerPrimary != ''">
            and t.project_management_manager_primary like concat('%', #{vo.projectManagementManagerPrimary},'%')
        </if>
        <if test="vo.projectName != null and vo.projectName != ''">
            and t.project_name like concat('%', #{vo.projectName},'%')
        </if>
        group by ${ sql}
        ) a order by index
```

# 三 easyexcel导出
##  3.1 根据维度导出
之前用过注解的方式导出,考虑到这次比较复杂一点就用模版填充的方式导出 ,刚做需求后面也很可能会改动,到时候也简单一点
```java
 // 根据维度查出数据
        List<VideoStatisticVO> voList1 = this.getVideoStatisticsByDim(vo, new ArrayList<>());
        List<VideoStatisticVO> voList=this.getVideoStatisticCount(voList1);
        String excelName=null;
        int num=1;
        if (vo.getStatisticDim().equals(DimensionEnum.UNITDIM.name())){
            excelName="建设单位维度汇总";
        }else if (vo.getStatisticDim().equals(DimensionEnum.PROMANAGEDIM.name())){
            excelName="项目管理专业维度汇总";
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITPROMANAGERDIM.name())){
            excelName="建设单位项目经理维度汇总";
            num = 2;
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITCITYCONSTRUCTDIM.name())){
            excelName="建设单位区县、施工单位维度汇总";
            num = 3;
        }else if (vo.getStatisticDim().equals(DimensionEnum.PROVINCEPROMANAGERDIM.name())){
            excelName="省管项目经理汇总";
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITCONSTRUCTDIM.name())){
            excelName="建设单位、施工单位汇总";
            num = 2;
        }else if (vo.getStatisticDim().equals(DimensionEnum.UNITPROCONSTRUCTDIM.name())){
            excelName="建设单位、项目、施工单位汇总";
            num = 3;
        }
        try {
            ClassPathResource classPathResource = null;

            classPathResource = new ClassPathResource("/template/"+excelName+".xlsx");
          
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder
                    .encode(excelName + "-" + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN), "UTF-8")
                    .replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            Map<String, Object> templateParamMap = new HashMap<>();
            LpsRemarkDicItem dicItem = new LpsRemarkDicItem();
            dicItem.setCode(vo.getStatisticDim());
            List<LpsRemarkDicItem> dicItems = dicItemService.selectListByCode(dicItem);
            StringBuilder builder = new StringBuilder();
            if (dicItems !=null && dicItems.size()>0){
                for (int i = 0; i < dicItems.size(); i++) {
                    builder.append(i+1).append(". ").append(dicItems.get(i).getDetail()).append("\r\n");
                }
            }

            ExcelFillCellMergePrevColUtils cellMergePrevColUtils = new ExcelFillCellMergePrevColUtils();
            // 合并总计行
            cellMergePrevColUtils.add(voList.size()+2 ,0,num);
            // 创建ExcelWriterBuilder
            ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream())
                    .withTemplate(classPathResource.getInputStream());
            ExcelWriter excelWriter = excelWriterBuilder.autoCloseStream(Boolean.FALSE)
                    // 列合并
                    .registerWriteHandler(cellMergePrevColUtils).build();

            WriteSheet writeSheet1 = EasyExcel.writerSheet().build();
            /**
             * 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
             * {} 代表普通变量 {.} 代表是list的变量
             * WriteSheet writeSheet1 = EasyExcel.writerSheet(sheetName).build();容易报空指针异常
             * 获取不到数据,可以选择不写或者升级版本3.0.1以上
             */

            // 填写配置,forceNewRow true表示自动创建一行,后面的数据后移
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

            excelWriter.fill(voList,fillConfig,writeSheet1);

            templateParamMap.put("title","QIP视频验收推进进展("+excelName+")");
            templateParamMap.put("remark",builder.toString());

            //填写数据
            excelWriter.fill(templateParamMap,writeSheet1);

            // 关闭填写
            excelWriter.finish();
            }catch (Exception e){}
```
![建设单位汇总](https://img-blog.csdnimg.cn/direct/ff5482c4ecf742dcac689038de47054d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4c921172600846c5a30a4421b06e3233.png)

![**最终效果**](https://img-blog.csdnimg.cn/direct/bb1481dfb745411696e31701a0d1dcf4.png)

## 3.2 不同数据导入到不同sheet中
这里也是采用模版导入,这里也犯了很多错误,下面会统一总结

```java
InputStream templateStream = classPathResource.getInputStream();

           // 1 设置响应格式
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder
                    .encode("视频验收汇总清单" + "-" + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN), "UTF-8")
                    .replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            
            // 2 创建一个XSSFWorkbook对象
            XSSFWorkbook workbook = new XSSFWorkbook(templateStream);
            //写到流里
            ByteArrayOutputStream bos1 = new ByteArrayOutputStream();

            workbook.write(bos1);
            byte[] bArray1 = bos1.toByteArray();
            InputStream is1 = new ByteArrayInputStream(bArray1);
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .withTemplate(is1).build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

            // 循环处理每个sheet页
            for (int i = 0; i < workbook.getNumberOfSheets()-2; i++) {
                XSSFSheet sheet = workbook.getSheetAt(i);
                String sheetName = sheet.getSheetName();
                String byExcelName = DimensionEnum.getNameByStatus(sheetName);
               vo.setStatisticDim(byExcelName);
                // 查询数据
                // 处理数据填充等操作
                List<VideoStatisticVO> voList1 = this.getVideoStatisticsByDim(vo, new ArrayList<>());
                List<VideoStatisticVO> voList = this.getVideoStatisticCount(voList1);
                Map<String, Object> templateParamMap = new HashMap<>();
                LpsRemarkDicItem dicItem = new LpsRemarkDicItem();
                dicItem.setCode(vo.getStatisticDim());
                List<LpsRemarkDicItem> dicItems = dicItemService.selectListByCode(dicItem);
                StringBuilder builder = new StringBuilder();
                if (dicItems !=null && dicItems.size()>0){
                    for (int k = 0; k < dicItems.size(); k++) {
                        builder.append(k+1).append(". ").append(dicItems.get(k).getDetail()).append("\r\n");
                    }
                }
                ExcelFillCellMergePrevColUtils cellMergePrevColUtils = new ExcelFillCellMergePrevColUtils();
                // 合并总计行
                int num =1;
                if (byExcelName.equals(DimensionEnum.UNITPROMANAGERDIM.name()) || byExcelName.equals(DimensionEnum.UNITCONSTRUCTDIM.name()) ){
                    num = 2 ;
                }else if(byExcelName.equals(DimensionEnum.UNITCITYCONSTRUCTDIM.name()) || byExcelName.equals(DimensionEnum.UNITPROCONSTRUCTDIM.name())) {
                    num = 3 ;
                }
                cellMergePrevColUtils.add(voList.size()+2 ,0,num);
                // 创建基于模板的WriteSheet对象
                WriteSheet writeSheet = EasyExcel.writerSheet(i).registerWriteHandler(cellMergePrevColUtils).build();

                // 填充数据到指定sheet页

                templateParamMap.put("title","QIP视频验收推进进展("+sheetName+")");
                templateParamMap.put("remark",builder.toString());
                //填写数据
                excelWriter.fill(voList, fillConfig, writeSheet);
                excelWriter.fill(templateParamMap,writeSheet);

            }
            // 处理第8 ,9sheet页数据
            WriteSheet writeSheet8= EasyExcel.writerSheet(workbook.getSheetName(7)).build();
            WriteSheet writeSheet9= EasyExcel.writerSheet(workbook.getSheetName(8)).build();
            List<VideoStatisticDTO> sheet8List = this.selectData(vo);
            excelWriter.fill(sheet8List,fillConfig,writeSheet8);
            excelWriter.fill(sheet8List,fillConfig,writeSheet9);


            //关闭流
            excelWriter.finish();
            bos1.close();
            is1.close();

```
然后是列合并的工具类
```java

//列合并工具类
public class ExcelFillCellMergePrevColUtils implements CellWriteHandler {
    private static final String KEY ="%s-%s";
    //所有的合并信息都存在了这个map里面
    Map<String, Integer> mergeInfo = new HashMap<>();

    public ExcelFillCellMergePrevColUtils() {
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
        //当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();

        Integer num = mergeInfo.get(String.format(KEY, curRowIndex, curColIndex));
        if(null != num){
            // 合并最后一行 ,列
            mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex,num);
        }
    }
    public void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex, int num) {
        Sheet sheet = writeSheetHolder.getSheet();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);
        sheet.addMergedRegion(cellRangeAddress);
    }
    //num从第几列开始增加多少列,(6,2,7)代表的意思就是第6行的第2列至第2+7也就是9列开始合并
    public void add (int curRowIndex,  int curColIndex , int num){
        mergeInfo.put(String.format(KEY, curRowIndex, curColIndex),num);
    }

}
```
# 四 总结错误
这里遇到了几个问题,总结一下
1 以流的形式输出文件,controller层返回格式为void
2   WriteSheet writeSheet1 = EasyExcel.writerSheet(sheetName).build();以这样方式写时报错,报dofill方法哪里空指针异常  没找到问题,可能是当时idea缓存,也有可能是版本低于3.0.0
3 分多个sheet页导出时忘记绑定模版报fill方法无法绑定模版

```java

 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .withTemplate(is1).build();
                    .withTemplate(is1)忘记写了
```
4 多个sheet页数据无法一次性导出,这里是先转成流最后一起输出
# 五 反思
在模版填充这里其实还可以动态表头模版导出数据的,这样就不用创建那么多模版了,后续需要优化,然后代码写法问题 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【IP 组播】PIM-SM

目录 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-SM 4.用户端DR与组播源端DR 5.从RPT切换到SPT 6.配置PIM-Silent接口 原理概述 PIM-SM 是一种基于Group-Shared Tree 的组播路由协议&#xff0c;与 PIM-DM 不同&#xff0c;它适合于组播组成…

SpringMVC第一个helloword项目

文章目录 前言一、SpringMVC是什么&#xff1f;二、使用步骤1.引入库2.创建控制层3.创建springmvc.xml4.配置web.xml文件5.编写视图页面 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; SpringMVC 提示&#xff1a;以下是本篇文章正文内容&#xf…

如何创建纯净版Django项目并启动?——让Django更加简洁

目录 1. Django的基本目录结构 2. 创建APP 2.1 创建app 2.2 配置文件介绍 3. 迁移数据库文件 3.2 连接数据库 3.1 创建迁移文件 3.2 同步数据库 4. 纯净版Django创建 4.1 剔除APP 4.2 剔除中间件 4.3 剔除模板引擎 5. 最终 1. Django的基本目录结构 在我们创建Django项…

吴恩达机器学习笔记 三十 什么是聚类 K-means

聚类(clustering)是一种无监督学习算法&#xff0c;关注多个数据点并自动找到相似的数据点&#xff0c;在数据中找到一种特定的结构。无监督学习算法的数据集中没有标签 y &#xff0c;所以不能说哪个是“正确的 y ”。 K-means算法 K-means算法就是在重复做两件事&#xff1a…

k8s 如何获取加入节点命名

当k8s集群初始化成功的时候&#xff0c;就会出现 加入节点 的命令如下&#xff1a; 但是如果忘记了就需要找回这条命令了。 kubeadm join 的命令格式如下&#xff1a;kubeadm join --token <token> --discovery-token-ca-cert-hash sha256:<hash>--token 令牌--…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理&#xff08;提问&#xff09;技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接&#xff1a; Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测&#xff1a;NL…

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志&#xff0c; 但是我们正常运行Qt程序&#xff0c;这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一&#xff1a; 步骤 主要使用的是Qt的 函…

磐启/PAN7030/2.4GHz 无线收发SOC芯片/ESSOP10/SOP16

1 概述 PAN7030 是一款集成 8 位 OTP MCU 和 2.4GHz 无线收发电路芯片&#xff0c;适合应用于玩具小车、 遥控器等领域。 PAN7030 内置 8 位 OTP MCU&#xff0c;包括 1.25KW 的程序存储器、80 字节数据存储器、16 位定 时器和 8 位/11 位 PWM 定时器、看门狗、电压比较器等…

OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何利用OpenCV4.9离散傅里叶变换 下一篇: 目标 本文内容主要介绍&#xff1a; 如何使用 YAML 或 XML 文件打印和读取文件和 OpenCV 的文本条目&#xff1f;如何对 OpenCV …

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

JAVA的NIO和BIO底层原理分析

文章目录 一、操作系统底层IO原理1. 简介2. 操作系统进行IO的流程 二、BIO底层原理1. 什么是Socket2. JDK原生编程的BIO 三、Java原生编程的NIO1. 简介2. NIO和BIO的主要区别3. Reactor模式4. NIO的三大核心组件5. NIO核心源码分析 一、操作系统底层IO原理 1. 简介 IO&#x…

Github万星项目lobe-chat,连接GPT4GPTs,平替chatgpt-plus

简介 Lobe Chat - 一个开源、高性能的聊天机器人框架&#xff0c;支持语音合成、多模态和可扩展的函数调用插件系统。支持一键免费部署您的私人 ChatGPT/LLM Web 应用程序。 项目地址&#xff1a; GitHub - lobehub/lobe-chat: &#x1f92f; Lobe Chat - an open-source, mo…

阿里云CentOS7安装MySQL8

创建目录 [rootnode1 ~]# mkdir /usr/local/mysql [rootnode1 ~]# cd /usr/local/mysql/ 下载安装包 到MySQL官网查看需要下载的版本&#xff0c;并获取到下载地址 https://downloads.mysql.com/archives/community/下载 [rootnode1 mysql]# wget https://downloads.mysql…

Flink RPC初探

1.RPC概述 RPC( Remote Procedure Call ) 的主要功能目标是让构建分布式计算(应用)更容易&#xff0c;在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标&#xff0c;RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。 总而言之&…

理想汽车推出首个全自研大模型Mind GPT,通过国家备案正式上线

理想汽车在今日宣布&#xff0c;其全自研的多模态认知大模型——Mind GPT&#xff0c;已正式通过国家《生成式人工智能服务管理暂行办法》的备案&#xff0c;并成功上线&#xff0c;标志着理想成为首个拥有自研大模型并通过国家备案的汽车厂商。 理想Mind GPT是汽车行业首个专门…

HTTP——Cookie

HTTP——Cookie 什么是Cookie通过Cookie访问网站 我们之前了解了HTTP协议&#xff0c;如果还有小伙伴还不清楚HTTP协议&#xff0c;可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136895597 我们今天来稍微了解一下HTTP里面一个很小的部分&…

报表控件Stimulsoft Reports、Dashboards 和 Forms 新版v2024.2发布!

我们很高兴地宣布发布用于创建报告、仪表板和表单的最新版本的 Stimulsoft 产品 - 2024.2&#xff01;在此更新中&#xff0c;您将找到适用于 Python 应用程序和服务的产品、新的仪表板元素、我们的组件与 .NET 8.0 的兼容性、仪表板交互性的增强功能等等。 Stimulsoft Ultima…

通过WSL在阿里云上部署Vue项目

参考&#xff1a; 阿里云上搭建网站-CSDN博客 云服务器重装 关闭当前运行实例 更换操作系统&#xff0c;还有其他的进入方式。 选择ubuntu系统&#xff08;和WSL使用相同的系统&#xff09;。 设置用户和密码。发送短信验证码。 新系统更新。秒速干净的新系统设置完成。 这…

Ansible-1

Ansible是一款自动化运维、批量管理服务器的工具&#xff0c;批量系统配置、程序部署、运行命令等功能。基于Python开发&#xff0c;基于ssh进行管理&#xff0c;不需要在被管理端安装任何软件。Ansible在管理远程主机的时候&#xff0c;只有是通过各种模块进行操作的。 需要关…

华润电力2024届校招人才测评通知润择认知能力测评考什么?

华润电力2024届校招人才测评通知润择认知能力测评考什么&#xff1f; 第一部分&#xff0c;认知测评润择-认知能力测评 您好! 本次测评包含逻辑推理、数字推理、语言理解三大类型的问卷。共计58题。 测评限时60分钟。其中逻辑推理、数字推理、语言推理分别限时20分钟。 如逾时…
最新文章