Java导出Excel并合并单元格

news2024/12/26 13:54:10

需求:需要在导出excel时合并指定的单元格

 ruoyi excel

项目基于若伊框架二次开发,本着能用现成的就不自己写的原则,先是尝试了@Excel注解中needMerge属性

     /**
     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
     */
    public boolean needMerge() default false;

查了一圈别人的使用,大致是需要定义一个List集合,集合元素为对象,对象中的属性标注@Excel注解,并表明name属性

照葫芦画瓢

@Getter
@Setter
@ToString
public class CutterControlVO {

    /** 主键 */
    private Long id;

    /** 工厂编码 */
    @Excel(name = "工厂编码",needMerge = true)
    private String factoryCode;

    /** 产线编码 */
    @Excel(name = "产线编码",needMerge = true)
    private String productionLineCode;

    /** 设备编号 */
    @Excel(name = "设备编号",needMerge = true)
    private String deviceNumber;

    /** 设备名称 */
    @Excel(name = "设备名称",needMerge = true)
    private String deviceName;

    @Excel(name = "检测刀具编码",needMerge = true)
    private String cutterCode;

    /** 换刀时间 */
    @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @Excel(name = "换刀时间",dateFormat = "yyyy-MM-dd HH:mm:ss",needMerge = true)
    private Date cutterChangeTime;

    /** 上刀数 */
    @Excel(name = "上刀数",needMerge = true)
    private Integer upperKnifeNumber;

    /** 下刀数 */
    @Excel(name = "下刀数",needMerge = true)
    private Integer lowerKnifeNumber;

    @Excel(name = "更换人员",needMerge = true)
    private String modifyUser;

    /** 备注 */
    @Excel(name = "备注",needMerge = true)
    private String remark;

    @Excel(name = "换刀位置")
    private List<CutterVO> cutterChangePosition;

    @Excel(name = "累计分切米数")
    private List<CutterVO> accumulatedCuttingMeters;


}
@Getter
@Setter
@ToString
public class CutterVO {

    @Excel(name = "上刀左")
    private Integer upperKnifeLeft;

    @Excel(name = "上刀中")
    private Integer upperKnifeCenter;

    @Excel(name = "上刀右")
    private Integer upperKnifeRight;

    @Excel(name = "下刀左")
    private Integer lowerKnifeLeft;

    @Excel(name = "下刀中")
    private Integer lowerKnifeCenter;

    @Excel(name = "下刀右")
    private Integer lowerKnifeRight;
}
@PostMapping("/export")
public void export(HttpServletResponse response) throws Exception{
    List<CutterControl> cutterControlList = cutterControlService.getCutterControlList();
    //设置导出的数据表格式
    List<CutterControlVO> cutterControlVOList = new ArrayList<>();
    CutterControlVO cutterControlVO = null;
    for (CutterControl cutterControl : cutterControlList) {
        cutterControlVO = new CutterControlVO();
        CutterVO cutterPosition = new CutterVO();
        cutterPosition.setUpperKnifeLeft(cutterControl.getCutterChangePositionUpperKnifeLeft());
        cutterPosition.setUpperKnifeCenter(cutterControl.getCutterChangePositionUpperKnifeCenter());
        cutterPosition.setUpperKnifeRight(cutterControl.getCutterChangePositionUpperKnifeRight());
        cutterPosition.setLowerKnifeLeft(cutterControl.getCutterChangePositionLowerKnifeLeft());
        cutterPosition.setLowerKnifeCenter(cutterControl.getCutterChangePositionLowerKnifeCenter());
        cutterPosition.setLowerKnifeRight(cutterControl.getCutterChangePositionLowerKnifeRight());

        CutterVO accumulatedCuttingMeters = new CutterVO();
        accumulatedCuttingMeters.setUpperKnifeLeft(cutterControl.getAccumulatedCuttingMetersUpperKnifeLeft());
        accumulatedCuttingMeters.setUpperKnifeCenter(cutterControl.getAccumulatedCuttingMetersUpperKnifeCenter());
        accumulatedCuttingMeters.setUpperKnifeRight(cutterControl.getAccumulatedCuttingMetersUpperKnifeRight());
        accumulatedCuttingMeters.setLowerKnifeLeft(cutterControl.getAccumulatedCuttingMetersLowerKnifeLeft());
        accumulatedCuttingMeters.setLowerKnifeCenter(cutterControl.getAccumulatedCuttingMetersLowerKnifeCenter());
        accumulatedCuttingMeters.setLowerKnifeRight(cutterControl.getAccumulatedCuttingMetersLowerKnifeRight());

        BeanUtils.copyProperties(cutterControl,cutterControlVO);
        cutterControlVO.setCutterChangePosition(Arrays.asList(cutterPosition));
        cutterControlVO.setAccumulatedCuttingMeters(Arrays.asList(accumulatedCuttingMeters));
        cutterControlVOList.add(cutterControlVO);
    }

    ExcelUtil<CutterControlVO> util = new ExcelUtil<CutterControlVO>(CutterControlVO.class);

    util.exportExcel(response,cutterControlVOList,"切刀管控台账数据");
}

查看导出效果:

黑人问号脸?

突然想到别人都是采用的是一个List集合,于是我注释了一个List,此时效果如下:

 可以看到,一个List效果是正常显示的,数据获取和显示也是正常的。

若伊使用的Excel导出工具类底层采用apache poi ,只能导出简单的excel表格,涉及复杂excel表格或者需要自定义表格时就比较难操作

使用阿里的easyExcel来实现复杂excel表格的导出

easyExcel

首先引入POM依赖

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.2.7</version>
    </dependency>

1、不合并单元格的写法

实体类

@Getter
@Setter
public class CutterControl {

    /** 主键 */
    @ExcelIgnore
    private Long id;

    /** 工厂编码 */
    @ExcelProperty(value = "工厂编码")
    private String factoryCode;

    /** 产线编码 */
    @ExcelProperty(value = "产线编码")
    private String productionLineCode;

    /** 设备编号 */
    @ExcelProperty(value = "设备编号")
    private String deviceNumber;

    /** 设备名称 */
    @ExcelProperty(value = "设备名称")
    private String deviceName;

    @ExcelProperty(value = "检测刀具编码")
    private String cutterCode;

    @ExcelProperty(value = "上刀左")
    private Integer cutterChangePositionUpperKnifeLeft;

    @ExcelProperty(value = "上刀中")
    private Integer cutterChangePositionUpperKnifeCenter;

    @ExcelProperty(value = "上刀右")
    private Integer cutterChangePositionUpperKnifeRight;

    @ExcelProperty(value = "下刀左")
    private Integer cutterChangePositionLowerKnifeLeft;

    @ExcelProperty(value = "下刀中")
    private Integer cutterChangePositionLowerKnifeCenter;

    @ExcelProperty(value = "下刀右")
    private Integer cutterChangePositionLowerKnifeRight;

    @ExcelProperty(value = "上刀左")
    private Integer accumulatedCuttingMetersUpperKnifeLeft;

    @ExcelProperty(value = "上刀中")
    private Integer accumulatedCuttingMetersUpperKnifeCenter;

    @ExcelProperty(value = "上刀右")
    private Integer accumulatedCuttingMetersUpperKnifeRight;

    @ExcelProperty(value = "下刀左")
    private Integer accumulatedCuttingMetersLowerKnifeLeft;

    @ExcelProperty(value = "下刀中")
    private Integer accumulatedCuttingMetersLowerKnifeCenter;

    @ExcelProperty(value = "下刀右")
    private Integer accumulatedCuttingMetersLowerKnifeRight;

    /** 换刀时间 */
    @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ExcelProperty(value = "换刀时间")
    @ColumnWidth(20)
    private Date cutterChangeTime;

    /** 上刀数 */
    @ExcelProperty(value = "上刀数")
    private Integer upperKnifeNumber;

    /** 下刀数 */
    @ExcelProperty(value = "下刀数")
    private Integer lowerKnifeNumber;

    @ExcelProperty(value = "更换人员")
    private String modifyUser;

    /** 备注 */
    @ExcelProperty(value = "备注")
    private String remark;

}

@ExcelIgnore :设置表格忽略该属性

@ColumnWidth(20): 设置列宽

controller代码

  @PostMapping("/export")
    public void export(HttpServletResponse response) throws Exception{
        List<CutterControl> cutterControlList = cutterControlService.getCutterControlList();
        String fileName = System.getProperty("user.dir") + "/" + System.currentTimeMillis() + ".xlsx";
        // 构建ExcelWriter
        ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build();
        // 构建sheet
        WriteSheet writeSheet = EasyExcel.writerSheet("切刀管控台账数据").head(CutterControl.class).build();
        // 写sheet
        excelWriter.write(cutterControlList, writeSheet);
        excelWriter.finish();
    }
结果:

2、自定义列合并策略

参考eastExcel文档可知,在实体类上添加属性即可实现我想要的效果

写Excel | Easy Excel

@Getter
@Setter
@EqualsAndHashCode
public class ComplexHeadData {
    @ExcelProperty({"主标题", "字符串标题"})
    private String string;
    @ExcelProperty({"主标题", "日期标题"})
    private Date date;
    @ExcelProperty({"主标题", "数字标题"})
    private Double doubleData;
}

再次照葫芦画瓢

@Getter
@Setter
public class CutterControl {

    /** 主键 */
    @ExcelIgnore
    private Long id;

    /** 工厂编码 */
    @ExcelProperty(value = "工厂编码")
    private String factoryCode;

    /** 产线编码 */
    @ExcelProperty(value = "产线编码")
    private String productionLineCode;

    /** 设备编号 */
    @ExcelProperty(value = "设备编号")
    private String deviceNumber;

    /** 设备名称 */
    @ExcelProperty(value = "设备名称")
    private String deviceName;

    @ExcelProperty(value = "检测刀具编码")
    private String cutterCode;

    @ExcelProperty({"换刀位置", "上刀左"})
    private Integer cutterChangePositionUpperKnifeLeft;

    @ExcelProperty({"换刀位置", "上刀中"})
    private Integer cutterChangePositionUpperKnifeCenter;

    @ExcelProperty({"换刀位置", "上刀右"})
    private Integer cutterChangePositionUpperKnifeRight;

    @ExcelProperty({"换刀位置", "下刀左"})
    private Integer cutterChangePositionLowerKnifeLeft;

    @ExcelProperty({"换刀位置", "下刀中"})
    private Integer cutterChangePositionLowerKnifeCenter;

    @ExcelProperty({"换刀位置", "下刀右"})
    private Integer cutterChangePositionLowerKnifeRight;

    @ExcelProperty({"累计分切米数", "上刀左"})
    private Integer accumulatedCuttingMetersUpperKnifeLeft;

    @ExcelProperty({"累计分切米数", "上刀中"})
    private Integer accumulatedCuttingMetersUpperKnifeCenter;

    @ExcelProperty({"累计分切米数", "上刀右"})
    private Integer accumulatedCuttingMetersUpperKnifeRight;

    @ExcelProperty({"累计分切米数", "下刀左"})
    private Integer accumulatedCuttingMetersLowerKnifeLeft;

    @ExcelProperty({"累计分切米数", "下刀中"})
    private Integer accumulatedCuttingMetersLowerKnifeCenter;

    @ExcelProperty({"累计分切米数", "下刀右"})
    private Integer accumulatedCuttingMetersLowerKnifeRight;

    /** 换刀时间 */
    @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ExcelProperty(value = "换刀时间")
    @ColumnWidth(20)
    private Date cutterChangeTime;

    /** 上刀数 */
    @ExcelProperty(value = "上刀数")
    private Integer upperKnifeNumber;

    /** 下刀数 */
    @ExcelProperty(value = "下刀数")
    private Integer lowerKnifeNumber;

    @ExcelProperty(value = "更换人员")
    private String modifyUser;

    /** 备注 */
    @ExcelProperty(value = "备注")
    private String remark;

}

其余不用修改

效果如下:

若需要导出excel在浏览器,修改Controller代码如下:

 @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception{
        List<CutterControl> cutterControlList = cutterControlService.getCutterControlList();
        String fileName = new String("切刀管控台账数据.xlsx");
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName );

        EasyExcel.write(response.getOutputStream(),CutterControl.class)
                .sheet("切刀管控台账数据")
                .doWrite(cutterControlList);
    }

3、自定义行合并策略

具体业务暂时用不到,需要的可参考这个博客

https://www.cnblogs.com/monianxd/p/16359369.html

导入excel并处理同名列

由于实体类中存在excel列名重复的情况,所以如果不进行处理,会出现只有一个有值的情况,最简单的处理方式如下:

同名列添加所在位置的索引,默认从0开始

@Getter
@Setter
public class CutterControl {

    /** 主键 */
    @ExcelIgnore
    private Long id;

    /** 工厂编码 */
    @ExcelProperty(value = "工厂编码")
    private String factoryCode;

    /** 产线编码 */
    @ExcelProperty(value = "产线编码")
    private String productionLineCode;

    /** 设备编号 */
    @ExcelProperty(value = "设备编号")
    private String deviceNumber;

    /** 设备名称 */
    @ExcelProperty(value = "设备名称")
    private String deviceName;

    @ExcelProperty(value = "检测刀具编码")
    private String cutterCode;

    @ExcelProperty(value = {"换刀位置", "上刀左"},index = 5)
    private Integer cutterChangePositionUpperKnifeLeft;

    @ExcelProperty(value = {"换刀位置", "上刀中"},index = 6)
    private Integer cutterChangePositionUpperKnifeCenter;

    @ExcelProperty(value = {"换刀位置", "上刀右"},index = 7)
    private Integer cutterChangePositionUpperKnifeRight;

    @ExcelProperty(value = {"换刀位置", "下刀左"},index = 8)
    private Integer cutterChangePositionLowerKnifeLeft;

    @ExcelProperty(value = {"换刀位置", "下刀中"},index = 9)
    private Integer cutterChangePositionLowerKnifeCenter;

    @ExcelProperty(value = {"换刀位置", "下刀右"},index = 10)
    private Integer cutterChangePositionLowerKnifeRight;

    @ExcelProperty(value = {"累计分切米数", "上刀左"},index = 11)
    private Integer accumulatedCuttingMetersUpperKnifeLeft;

    @ExcelProperty(value = {"累计分切米数", "上刀中"},index = 12)
    private Integer accumulatedCuttingMetersUpperKnifeCenter;

    @ExcelProperty(value = {"累计分切米数", "上刀右"},index = 13)
    private Integer accumulatedCuttingMetersUpperKnifeRight;

    @ExcelProperty(value = {"累计分切米数", "下刀左"},index = 14)
    private Integer accumulatedCuttingMetersLowerKnifeLeft;

    @ExcelProperty(value = {"累计分切米数", "下刀中"},index = 15)
    private Integer accumulatedCuttingMetersLowerKnifeCenter;

    @ExcelProperty(value = {"累计分切米数", "下刀右"},index = 16)
    private Integer accumulatedCuttingMetersLowerKnifeRight;

    /** 换刀时间 */
    @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ExcelProperty(value = "换刀时间")
    @ColumnWidth(20)
    private Date cutterChangeTime;

    /** 上刀数 */
    @ExcelProperty(value = "上刀数")
    private Integer upperKnifeNumber;

    /** 下刀数 */
    @ExcelProperty(value = "下刀数")
    private Integer lowerKnifeNumber;

    @ExcelProperty(value = "更换人员")
    private String modifyUser;

    /** 备注 */
    @ExcelProperty(value = "备注")
    private String remark;

}

导入Controller代码

@PostMapping("/import")
    public R importData(@RequestParam(value = "file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        if (!(suffixName.equals(".xlsx"))) {
            return R.fail("请上传xlsx格式文件");
        }

        EasyExcel.read(file.getInputStream(), CutterControl.class, new ReadListener<CutterControl>() {
            /**
             * 单次缓存的数据量
             */
            public static final int BATCH_COUNT = 100;
            /**
             *临时存储
             */
            private List<CutterControl> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

            @Override
            public void invoke(CutterControl data, AnalysisContext context) {
                cachedDataList.add(data);
                if (cachedDataList.size() >= BATCH_COUNT) {
                    saveData();
                    // 存储完成清理 list
                    cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
                }
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                saveData();
            }

            /**
             * 加上存储数据库
             */
            private void saveData() {
                cutterControlService.batchInsertCutterControl(cachedDataList);
                log.info("{}条数据,开始存储数据库!", cachedDataList.size());
                log.info("存储数据库成功!");
            }
        }).sheet().doRead();
        return R.ok();
    }

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

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

相关文章

11 - PXC集群|MySQL存储引擎

PXC集群&#xff5c;MySQL存储引擎 数据库系列文章PXC集群配置集群测试集群 MySQL存储引擎存储引擎介绍mysql服务体系结构mysql服务的工作过程处理查询访问的工作过程处理存储insert访问的工作过程 什么是搜索引擎 存储引擎管理查看存储引擎修改存储引擎 存储引擎特点myisam存储…

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr&#xff0c;求 min(b) 的总和&#xff0c;其中 b 的范围涵盖 arr 的每个&#xff08;连续&#xff09;子数组。由于答案可能很大&#xff0c;因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…

【排序算法】五、冒泡排序(C/C++)

「前言」文章内容是排序算法之冒泡排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 冒泡排序1.1 原理1.2 代码实现&#xff08;C/C&#xff09;1.3 特性总结 冒泡排序 1.1…

基于Springboot的民宿在线预定平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民宿在线预定平台(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

SAI实例研究

实现目标 接到特定任务后&#xff0c;召唤生物攻击当前角色 例子 creature.id 15402&#xff08;即 smart_script.entryorguid&#xff09;共分为0和1两个事件阶段 第0阶段&#xff1a;第1条(id 0&#xff09;&#xff0c;第2条(id 1&#xff09;&#xff0c;第3条(id 2…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪&#xff0c;人、车流量统计&#xff0c;越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…

PACS医学影像采集传输与存储管理、影像诊断查询与报告管理系统,MPR多平面重建

按照国际标准IHE规范&#xff0c;以高性能服务器、网络及存储设备构成硬件支持平台&#xff0c;以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;以医疗影像的采集、传输、存储和诊断为核心&#xff0c;集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息…

使用JFLASH实现文件程序自动化合并及下载功能

主要总结下使用 SEGGER 工具集的 JFLASH 软件实现hex/bin文件合并以及程序的自动下载使用方法。 起因是最近使用到LVGL字库文件的制作&#xff0c;每次都要将分散的bin文件按既定分配的偏移作合并处理&#xff0c;刚开始使用的是二进制文件合并工具,文件少的时候还行&#xff…

C#使用DateTime.Now静态属性动态获得系统当前日期和时间

目录 一、实例 1.源码 2.生成效果 二、相关知识点 1.Thread类 &#xff08;1&#xff09;Thread.Sleep()方法 &#xff08;2&#xff09;Thread(ThreadStart) &#xff08;3&#xff09;IsBackground &#xff08;4&#xff09;Invoke( &#xff09; 2.CreateGrap…

【c++函数重载】

文章目录 一. 命名空间二 .全缺省参数和半缺省参数三 . 函数重载 一. 命名空间 1.不指定域&#xff1a;先在局部找&#xff0c;再全局。 2. 指定域&#xff1a;到指定的命名空间去找。 3. 当把指定命名空间放开时&#xff0c;即using namespace std&#xff1b;例如放开标准c库…

分布式 session

分布式 session 种 session 的时候需要注意范围&#xff0c;也就是 cookie.domain。 比如两个域名&#xff1a;a.heo.com&#xff0c;b.heo.com。如果要共享 cookie&#xff0c;可以种一个更高层的公共域名&#xff0c;比如 heo.com。 当服务器 A &#xff08;localhost:808…

大数据平台的硬件规划、网络调优、架构设计、节点规划

1.大数据平台硬件选型 要对Hadoop大数据平台进行硬件选型,首先需要了解Hadoop的运行架构以及每个角色的功能。在一个典型的Hadoop架构中,通常有5个角色,分别是NameNode、Standby NameNode、ResourceManager、NodeManager、DataNode以及外围机。 其中 NameNode 负责协调集群…

OneNote使用总结

试一下OneNote表格复制到CSDN的编辑器 用表格整理内容挺方便的&#xff0c;不过复制过来格式还是有些变化 目录 常用快捷键 高级应用 常用快捷键 文字编辑与排版 字号增加减小 Ctrl Shift 大于小于号 整行上下移动 左右缩进 Alt Shift方向 插入或转为公式 Alt 等于…

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博客

Python笔记10-数据可视化练习折线图

文章目录 JSON数据Python数据和Json数据的相互转化pyecharts模块构建折线图全局配置绘制疫情数据折线图 JSON数据 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。本质上是一个带有特定格式的字符串 主要功能&#xff1a;可以在各个编程语言中流通…

R语言的ggplot2绘制分组折线图?

R绘制分组折线图.R 首先看数据情况&#xff1a;group有3组。Time有3组&#xff0c;数据意思是在3组3个时间点测量了某指标&#xff0c;现在要绘制组1、组2、组3某指标y按时间的变化趋势 数据情况&#xff1a; 看看最终的效果图如下&#xff1a; 下面是本次使用的代码 .libPat…

合并两个有序数组(三指针法)

这道题使用三指针法&#xff0c;实际上是创建三个变量模拟下标的走势&#xff1a; 一般常规想法是先合并再排序&#xff0c;三指针则是边合并边排序&#xff1b; l1是nums1的有效数据的最后一位的下标&#xff0c;即m - 1&#xff1b; l2是num2的有效数据的最后一位的下标&a…

conda修改默认环境安装位置

conda修改默认环境安装位置 文章目录 conda修改默认环境安装位置查看conda配置信息创建.condarc&#xff08;conda runtime controlling)配置文件没有.condarc怎么办 即使创建正确放置了.condarc创建环境时还是默认指定C盘目录写权限目录修改权限 查看conda配置信息 conda con…

前端实现贪吃蛇功能

大家都玩过贪吃蛇小游戏&#xff0c;控制一条蛇去吃食物&#xff0c;然后蛇在吃到食物后会变大。本篇博客将会实现贪吃蛇小游戏的功能。 1.实现效果 2.整体布局 /*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: re…