EasyExcel 动态设置表格的背景颜色和排列

        项目中使用EasyExcel把数据以excel格式导出,其中设置某一行、某一列单元格的背景颜色、排列方式十分常用,记录下来方便以后查阅。

1. 导入maven依赖:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>3.1.0</version>
	<scope>compile</scope>
</dependency>

2. 导出字段实体类:

@Data
@NoArgsConstructor
@Accessors(chain = true)
public class AchievementParamExcelDto {

    /**
     * 字段是动态配置的,配置哪些显示哪些
     */
    @ExcelProperty(value = "产品类别", converter = NullConverter.class)
    @AchievementParam("0001001")
    private String type;

    @ExcelProperty(value = "商品名称(开票名称)", converter = NullConverter.class)
    @AchievementParam("0001002")
    private String commodityName;

    @ExcelProperty(value = "品牌", converter = NullConverter.class)
    @AchievementParam("0001003")
    private String brand;

    @ExcelProperty(value = "型号", converter = NullConverter.class)
    @AchievementParam("0001004")
    private String model;

    @ExcelProperty(value = "技术规格", converter = NullConverter.class)
    @AchievementParam("0001005")
    private String technicalSpecifications;

    @ExcelProperty(value = "单位", converter = NullConverter.class)
    @AchievementParam("0001006")
    private String unit;

    @ExcelProperty(value = "数量", converter = IntegerNumberConverter.class)
    @AchievementParam("0001007")
    private Integer num;

    @ExcelProperty(value = "单价", converter = IntegerNumberConverter.class)
    @AchievementParam("0001008")
    private BigDecimal unitPrice;

    @ExcelProperty(value = "小计(元)", converter = IntegerNumberConverter.class)
    @AchievementParam("0001009")
    @NumberFormat("#.00")
    private BigDecimal subtotal;

    @ExcelProperty(value = "物料代码", converter = NullConverter.class)
    @AchievementParam("0001010")
    private String materialCode;

    @ExcelProperty("备注")
    @AchievementParam("0001011")
    private String remark;

    @ExcelProperty(value = "序号", converter = IntegerNumberConverter.class)
    @AchievementParam("0001012")
    private Integer index;

    @ExcelProperty(value = "销售项名称", converter = NullConverter.class)
    @AchievementParam("0001013")
    private String name;

    @ExcelProperty(value = "销售项编码", converter = NullConverter.class)
    @AchievementParam("0001014")
    private String itemCode;

    public AchievementParamExcelDto(int index, AchievementVo vo, String remark) {
        this.index = index;
        this.name = handleNull(vo.getName());
        this.type = handleNull(vo.getType());
        this.commodityName = handleNull(vo.getCommodityName());
        this.brand = handleNull(vo.getBrand());
        this.model = handleNull(vo.getModel());
        this.technicalSpecifications = handleNull(vo.getTechnicalSpecifications());
        this.unit = handleNull(vo.getUnit());
        this.num = StringUtils.isEmpty(vo.getNum()) ? 0: Integer.parseInt(vo.getNum());
        this.unitPrice = vo.getUnitPrice();
        this.subtotal = vo.getSubtotal();
        this.materialCode = StringUtils.isEmpty(vo.getMaterialCode()) ? "无固定物料" : vo.getMaterialCode();
        this.remark = remark;
        this.itemCode = StringUtils.isEmpty(vo.getItemCode()) ? (StringUtils.isEmpty(vo.getMaterialCode()) ? "— —" : vo.getMaterialCode()) : vo.getItemCode();
    }

    private String handleNull(String str) {
        return StringUtils.isEmpty(str) ? "— —" : str;
    }
}

3. 数据导出业务,并在业务中实现动态设置背景颜色和排列方式:

private void doDownloadAchievementExcelFile(List<AchievementsExportParamEntity> achievementExportParam,
             List<AchievementParamExcelDto> result, HttpServletResponse response, String fileName) {
        if (CollectionUtils.isEmpty(achievementExportParam)) {
            return;
        }
        // excel表头
        List<List<String>> header = new ArrayList<>();
        // 需要导出的数据字段
        List<String> includeColumnFiledNames = new ArrayList<>();
        // 导出实体类中所有的字段
        Field[] fields = ReflectUtil.getFields(AchievementParamExcelDto.class);

        achievementExportParam.sort(Comparator.comparing(AchievementsExportParamEntity::getSort));
        // 通过配置导出的字段来动态设置表头和行字段数据
        for (AchievementsExportParamEntity achievementsExportParamEntity : achievementExportParam) {
            String paramCode = achievementsExportParamEntity.getParamCode();
            //设置需要导出的头、行字段
            for (Field field : fields) {
                AchievementParam annotation = field.getAnnotation(AchievementParam.class);
                if (annotation == null) {
                    continue;
                }
                if (StringUtils.equals(paramCode, annotation.value())) { // 判断字段是否有配置导出
                    header.add(Lists.newArrayList(achievementsExportParamEntity.getParamName())); // 添加头数据
                    includeColumnFiledNames.add(field.getName()); // 添加需要导出的行字段数据
                    break;
                }
            }
        }

        /******************下面是设置背景颜色和排列方式的关键代码******************/
        // 按类型进行设置背景颜色
        Map<Integer, Short> rowBackColor = new HashMap<>();
        for (int i = 0; i < result.size(); i++) {
            AchievementParamExcelDto achievementParamExcelDto = result.get(i);
            String remark = achievementParamExcelDto.getRemark();
            if ("软件".equals(remark)) {
                // 表格的行索引从1开始,列索引从0开始
                rowBackColor.put(i + 1, IndexedColors.LEMON_CHIFFON.index);
            } else if ("硬件".equals(remark)) {
                rowBackColor.put(i + 1, IndexedColors.LIGHT_TURQUOISE.index);
            } else if ("模型".equals(remark)) {
                rowBackColor.put(i + 1, IndexedColors.LIGHT_GREEN.index);
            }else if ("实施服务".equals(remark)) {
                rowBackColor.put(i + 1, IndexedColors.LIGHT_CORNFLOWER_BLUE.index);
            }
        }

        // 导出时技术规格居左显示,其它剧中显示
        Map<Integer, HorizontalAlignment> horizontalAlignmentMap = new HashMap<>();
        for (int i = 0; i < header.size(); i++) {
            if ("技术规格".equals(header.get(i).get(0))) {
                horizontalAlignmentMap.put(i, HorizontalAlignment.LEFT);
            } else {
                horizontalAlignmentMap.put(i, HorizontalAlignment.CENTER);
            }
        }

        try {
            Class<? extends AchievementParamExcelDto> aClass = AchievementParamExcelDto.class;
            // 设置字段顺序
            Set<String> orderColumn = new LinkedHashSet<>(includeColumnFiledNames);
            for (Field field : fields) {
                orderColumn.add(field.getName());
            }
            setExcelIndex(aClass, new ArrayList<>(orderColumn));

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            fileName = URLEncoder
                    .encode(fileName, "UTF-8")
                    .replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            EasyExcel.write(response.getOutputStream(), aClass)
                    .registerWriteHandler(new CustomCellWriteHandler(rowBackColor, horizontalAlignmentMap))
                    .registerWriteHandler(new WidthWriteHandler())
                    .sheet("成果物清单")
                    .head(header)
                    .includeColumnFieldNames(includeColumnFiledNames)
                    .doWrite(result);
        } catch (Exception e) {
            log.error("download error", e);
            throw new BusinessException(ErrorCodes.FILE_DOWNLOAD_ERROR);
        }
    }

4. 在自定义样式的handle中根据配置数据动态显示样式:

public class CustomCellWriteHandler implements CellWriteHandler {

    // 一个表格最多创建6W个样式,把每行的背景色放到集合中,统一设置,避免设置失败
    Map<Integer, Short> rowBackColor = new HashMap<>();
    // 排列样式集合
    Map<Integer, HorizontalAlignment> horizontalAlignmentMap = new HashMap<>();

    public CustomCellWriteHandler() {
    }

    public CustomCellWriteHandler(Map<Integer, Short> rowBackColor, Map<Integer, HorizontalAlignment> horizontalAlignmentMap) {
        this.rowBackColor = rowBackColor;
        this.horizontalAlignmentMap = horizontalAlignmentMap;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                 Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        // 设置行高
        short height = 600;
        row.setHeight(height);
    }

    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        Cell cell = context.getCell();
        // 当前事件会在 数据设置到poi的cell里面才会回调
        // 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not true
        if (!BooleanUtils.isNotTrue(context.getHead())) { // 表头
            Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
            CellStyle cellStyle = workbook.createCellStyle();
            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            // 颜色
            // 设置rgb颜色
            byte[] rgb = new byte[]{(byte) 192, 0, 0};
            XSSFCellStyle xssfCellColorStyle = (XSSFCellStyle) cellStyle;
            xssfCellColorStyle.setFillForegroundColor(new XSSFColor(rgb, null));
            xssfCellColorStyle.setAlignment(HorizontalAlignment.CENTER);
            xssfCellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 宽度
            // 边框
            xssfCellColorStyle.setBorderBottom(BorderStyle.THIN);
            xssfCellColorStyle.setBorderLeft(BorderStyle.THIN);
            xssfCellColorStyle.setBorderRight(BorderStyle.THIN);
            xssfCellColorStyle.setBorderTop(BorderStyle.THIN);

            // 字体
            Font font = workbook.createFont();
            font.setBold(true);
            font.setFontHeightInPoints((short) 11);
            font.setFontName("微软雅黑");
            font.setColor(IndexedColors.WHITE.getIndex());
            xssfCellColorStyle.setFont(font);

            cell.setCellStyle(xssfCellColorStyle);
            context.getFirstCellData().setWriteCellStyle(null);
        } else { // 单元格
            // 拿到poi的workbook
            Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
            // 不同单元格尽量传同一个 cellStyle
            CellStyle cellStyle = workbook.createCellStyle();

            /***************下面是关键代码,根据表格的行号和列号与设置的数据进行匹配后动态设置***********/
            // 行号-重要***
            Integer rowIndex = context.getRowIndex();
            // 如果设置了每行的样式,动态设置;没有设置则统一设置为白色背景
            if (null != rowBackColor.get(rowIndex)) {
                // 拿到设置的颜色
                Short colorIndex = rowBackColor.get(rowIndex);
                cellStyle.setFillForegroundColor(colorIndex);
            } else {
                // 默认背景颜色
                cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            }

            // 列号-重要***
            Integer columnIndex = context.getColumnIndex();
            // 技术规格左对齐,其它剧中对齐
            if (null != horizontalAlignmentMap.get(columnIndex)) {
                cellStyle.setAlignment(horizontalAlignmentMap.get(columnIndex));
            } else {
                cellStyle.setAlignment(HorizontalAlignment.CENTER);
            }

            // 垂直居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            // 边框
            cellStyle.setBorderBottom(BorderStyle.THIN);
            cellStyle.setBorderLeft(BorderStyle.THIN);
            cellStyle.setBorderRight(BorderStyle.THIN);
            cellStyle.setBorderTop(BorderStyle.THIN);

            // 字体
            Font font = workbook.createFont();
            font.setFontHeightInPoints((short) 8);
            font.setFontName("微软雅黑");
            cellStyle.setFont(font);

            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            cell.setCellStyle(cellStyle);
            // 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确
            // 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
            // cell里面去 会导致自己设置的不一样(很关键)
            context.getFirstCellData().setWriteCellStyle(null);
        }
    }
}

5. 至此,主要的代码实现完了,实现的效果:

 

在第3步中,有涉及到几个方法或实体类,这里对应给出补充:

①入参result,是上一步从数据库中查询并封装后的数据,大致如下:

List<AchievementParamExcelDto> result = new ArrayList<>();
int index = 1;
for (AchievementVo achievementVo : distAchievementDto.getSaleList()) {
    result.add(new AchievementParamExcelDto(index++, achievementVo, localeMessage.getMessage(LanguageCn.PRODUCT_TYPE_SOFTWARE)));
}
for (AchievementVo achievementVo : distAchievementDto.getHardwareList()) {
    if (achievementVo.getSubtotal() != null && achievementVo.getSubtotal().compareTo(BigDecimal.ZERO) > 0) { // 只导出小计大于0的数据
        result.add(new AchievementParamExcelDto(index++, achievementVo, localeMessage.getMessage(LanguageCn.PRODUCT_TYPE_HARDWARE)));
    }
}
for (AchievementVo achievementVo : distAchievementDto.getModelList()) {
    result.add(new AchievementParamExcelDto(index++, achievementVo, localeMessage.getMessage(LanguageCn.PRODUCT_TYPE_MODEL)));
}
for (AchievementVo achievementVo : distAchievementDto.getServiceList()) {
    result.add(new AchievementParamExcelDto(index++, achievementVo, localeMessage.getMessage(LanguageCn.PRODUCT_TYPE_SERVICE)));
}

 distAchievementDto对应的数据结构如下(AchievementVo便是业务中数据实体类了,可参考效果图中的字段):

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DistAchievementDto implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "软件销售清单", example = "[]")
    private List<AchievementVo> saleList = new ArrayList<>();

    @ApiModelProperty(value = "实施服务销售清单", example = "[]")
    private List<AchievementVo> serviceList = new ArrayList<>();

    @ApiModelProperty(value = "硬件销售清单", example = "[]")
    private List<AchievementVo> hardwareList = new ArrayList<>();

    @ApiModelProperty(value = "模型清单", example = "[]")
    private List<AchievementVo> modelList = new ArrayList<>();
}

② 入参 achievementExportParam 是从数据库中查出的配置导出的字段:

@EqualsAndHashCode(callSuper = true)
@Data
public class AchievementsExportParamEntity extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("导出类别:1-SPS;2-供方案使用;5-海外版本")
    private Integer exportType;

    @ApiModelProperty("导出字段编码")
    private String paramCode;

    @ApiModelProperty("导出字段名称")
    private String paramName;

    @ApiModelProperty("是否选中:0-否 1-是 默认值是0")
    private String paramSelected;

    @ApiModelProperty("导出顺序")
    private Integer sort;
}

 ③ 排序方法 setExcelIndex

@SuppressWarnings("unchecked")
private synchronized void setExcelIndex(Class<?> aClass, List<String> columnNames) throws NoSuchFieldException, IllegalAccessException {
    //获取当前对象的字段
    ArrayList<Field> fields = Lists.newArrayList(aClass.getDeclaredFields());
    Class<?> superclass = aClass.getSuperclass();
    if (superclass != null) {//有父类则获取父类对象的字段
        fields.addAll(Lists.newArrayList(superclass.getDeclaredFields()));
    }
    for (int i = 0; i < columnNames.size(); i++) {
        for (Field field : fields) {
            if (!field.getName().equals(columnNames.get(i))) continue;
            ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
            if (annotation == null) continue;
            InvocationHandler handler = Proxy.getInvocationHandler(annotation);
            //获取 AnnotationInvocationHandler 的 memberValues 字段
            Field fieldMv = handler.getClass().getDeclaredField("memberValues");
            //因为这个字段是 private final 修饰,所以要打开权限
            fieldMv.setAccessible(true);
            Map<Object, Object> memberValues = (Map<Object, Object>) fieldMv.get(handler);
            if (!memberValues.containsKey("value")) continue;
            memberValues.put("index", i);
        }
    }
}

④ 自定义单元格宽度样式 WidthWriteHandler

public class WidthWriteHandler extends AbstractColumnWidthStyleStrategy {

    private final Map<String, Integer> map = new ImmutableMap.Builder<String, Integer>()
            .put("序号", 9)
            .put("名称", 18)
            .put("产品类别", 32)
            .put("商品名称(开票名称)", 22)
            .put("品牌", 10)
            .put("型号", 25)
            .put("技术规格", 30)
            .put("单位", 9)
            .put("数量", 9)
            .put("单价(元)", 9)
            .put("小计(元)", 9)
            .put("单价(美元)", 9)
            .put("小计(美元)", 9)
            .put("物料代码", 12)
            .put("成果物类别", 11)
            .put("销售项编码", 12)
            .build();

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell,
                                  Head head, Integer relativeRowIndex, Boolean isHead) {
        if (isHead) {
            String stringCellValue = cell.getStringCellValue();
            Integer integer = map.get(stringCellValue.trim());
            if (null == integer) {
                integer = 18;
            }
            Sheet sheet = writeSheetHolder.getSheet();
            int columnIndex = cell.getColumnIndex();
            // 列宽40
            sheet.setColumnWidth(columnIndex, integer * 256);
        }
    }
}

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

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

相关文章

如何在谷歌浏览器中设置标签页分组

在日常浏览网页时&#xff0c;我们常常会打开多个标签页。随着标签页数量的增加&#xff0c;管理它们变得越来越困难。幸运的是&#xff0c;谷歌浏览器提供了一些实用的功能&#xff0c;可以帮助我们更好地组织和分组标签页。本教程将向您展示如何设置标签页分组&#xff0c;并…

多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

vscode中同时运行两个python文件(不用安装插件)

如何在vscode中同时运行两个python文件呢&#xff1f;今天在工作中遇到了这个问题。 查了网上的方法是安装coder runner插件&#xff0c;后来发现自身就有这个功能。所以记录一下,方便后续查找: 这是我的第一个文件&#xff0c;点击右上角的运行旁边的小箭头&#xff0c;有一…

java全栈day17--Web后端实战(java操作数据库)

前言&#xff1a;本章应该是针对数据库基础讲解&#xff0c;数据的增删改查但是本人忘记对知识进行归纳总结就直接跳过&#xff0c;基本的内容都很简单&#xff0c;都是套式子使用。现在开始学习本章&#xff0c;很重要需要好好掌握。 一、使用的工具 二、JDBC 2.1概述 JDBC …

谷歌发布最新视频生成模型 Veo 2:视频生成AI新王牌

谷歌 在当今数字化快速发展的时代&#xff0c;人工智能视频生成技术正不断突破创新。就在12月17日&#xff0c;谷歌推出了一个新的视频模型 Veo 2 。 Veo 2 Veo 2 Veo 2 可以创建各种主题和风格的高质量视频。在谷歌官方由人工评估员判断中&#xff0c;Veo 2 与领先模型相比取得…

从腾讯云的恶意文件查杀学习下PHP的eval函数

问题来自于腾讯云的主机安全通知&#xff1a; &#x1f680;一键接入&#xff0c;畅享GPT及AI大模型服务&#xff01;【顶级API中转品牌】&#xff1a; https://api.ablai.top/ 病毒文件副本内容如下&#xff1a; <?php function x($x){eval($x);}x(str_rot13(riny($_CBF…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接

介绍 Redis 哨兵模式&#xff08;Sentinel&#xff09;是 Redis 集群的高可用解决方案&#xff0c;它主要用于监控 Redis 主从复制架构中的主节点和从节点的状态&#xff0c;并提供故障转移和通知功能。通过 Redis 哨兵模式&#xff0c;可以保证 Redis 服务的高可用性和自动故…

golang操作sqlite3加速本地结构化数据查询

目录 摘要Sqlite3SQLite 命令SQLite 语法SQLite 数据类型列亲和类型——优先选择机制 SQLite 创建数据库SQLite 附加数据库SQLite 分离数据库 SQLite 创建表SQLite 删除表 SQLite Insert 语句SQLite Select 语句SQLite 运算符SQLite 算术运算符SQLite 比较运算符SQLite 逻辑运算…

Android v4和v7冲突

android.useAndroidXtrue android.enableJetifiertruev4转成AndroidX

【MySQL】优雅的使用MySQL实现分布式锁

MySQL实现分布式锁 引言二、基于唯一索引2.1、实现思路2.2、代码实现2.3、 测试代码2.4、小结 三、基于悲观锁3.1 、实现思路3.2、代码实现3.3、测试代码3.4、小结 四、基于乐观锁4.1 、实现思路4.2 、代码实现4.3 、测试代码4.4、小结 总结 引言 在文章《Redis实现分布式锁详…

生活小妙招之UE CaptureRT改

需求&#xff0c;四个不同的相机拍摄结果同屏分屏显示 一般的想法是四个Capture拍四张RT&#xff0c;然后最后在面片/UI上组合。这样的开销是创建4张RT&#xff0c;材质中采样4次RT。 以更省的角度&#xff0c;想要对以上流程做优化&#xff0c;4个相机拍摄是必须的&#xff…

1 JVM JDK JRE之间的区别以及使用字节码的好处

JDK jdk是编译java源文件成class文件的&#xff0c;我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹&#xff0c;如下图所示: 遵循着编译原理&#xff0c;把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…

【Unity功能集】TextureShop纹理工坊(二)图层(上)

项目源码&#xff1a;后期发布 索引 图层TextureLayer可见性激活性可编辑性绘画区域、绘画板绘画区域锚点导入图像 图层 在PS中&#xff0c;图层的概念贯穿始终&#xff08;了解PS图层&#xff09;&#xff0c;他可以称作PS最基础也是最强大的特性之一。 那么&#xff0c;在T…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

二、FIFO缓存

FIFO缓存 1.FIFO缓存介绍2.FIFO缓存实现3.FIFO缓存总结 1.FIFO缓存介绍 FIFO&#xff08;First-In-First-Out&#xff09;缓存 是一种简单的缓存淘汰策略&#xff0c;它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时&#xff0c;最先进入缓存的元素会被移…

王佩丰24节Excel学习笔记——第十四讲:日期函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 掌握date()日期函数&#xff0c;配合年月日时分秒使用使用datedif()函数计算两个日期之前的差&#xff0c;重点记住参数三&#xff0c;差的值以哪种类型显示。使用weeknum/weekday,…

python--在服务器上面创建conda环境

今天刚开始使用服务器的时候使用上面的公共环境发现老师缺少模块&#xff0c; [guoyupingcins195 ~]$ conda --version Traceback (most recent call last): File "/home/miniconda3/bin/conda", line 12, in <module> from conda.cli import main Fil…

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…