easyExcel - 按模板导出

目录

  • 前言
  • 一、情景介绍
  • 二、文档介绍
    • 2.1 读取模板
    • 2.2 填充模板
  • 三、代码示例
    • 3.1 案例一:工资表
    • 3.2 案例二:报价单
  • 四、我所遇到的问题


前言

Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025

之前有介绍过如何使用 easyExcel,以及写了两个入门的 demo ,这两个 demo 能应付在开发中大多数的导入和导出需求,不过有时候面对一些复杂的表格,就会有点不够用,该篇是如何使用模板实现导出功能


一、情景介绍

在实际的开发过程中可能会遇到需要导出一些带有复杂表头的表格,比如:工资表和考勤表

在这里插入图片描述

在这里插入图片描述

或者是类似于发票、报价单这种具有模板性质的表格

在这里插入图片描述

在这里插入图片描述

如果仅仅通过代码去实现是比较困难的,通常情况下会写一个模板 excel,模板中的需要变动的数据用占位符替代,导出的文件按照该模板填充数据


二、文档介绍

easyexcel 也提供了根据模板写入的功能,可以用较为简单的方式实现上述功能,其基本步骤为:

  • ① 读取模板文件
  • ② 填充模板中的占位符

2.1 读取模板

官方文档:根据模板写入

在这里插入图片描述

在官方文档中给出了如何使用 easyexcel 读取模板的代码示例:

官网代码示例:

    /**
     * 根据模板写入
     * <p>1. 创建excel对应的实体对象 参照{@link IndexData}
     * <p>2. 使用{@link ExcelProperty}注解指定写入的列
     * <p>3. 使用withTemplate 写取模板
     * <p>4. 直接写即可
     */
    @Test
    public void templateWrite() {
        String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        String fileName = TestFileUtil.getPath() + "templateWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 这里要注意 withTemplate 的模板文件会全量存储在内存里面,所以尽量不要用于追加文件,如果文件模板文件过大会OOM
        // 如果要再文件中追加(无法在一个线程里面处理,可以在一个线程的建议参照多次写入的demo) 建议临时存储到数据库 或者 磁盘缓存(ehcache) 然后再一次性写入
        EasyExcel.write(fileName, DemoData.class).withTemplate(templateFileName).sheet().doWrite(data());
    }

从上述示例代码中可以看到读取模板文件的方法为:withTemplate()

    public ExcelWriterBuilder withTemplate(InputStream templateInputStream) {
        this.writeWorkbook.setTemplateInputStream(templateInputStream);
        return this;
    }

    public ExcelWriterBuilder withTemplate(File templateFile) {
        this.writeWorkbook.setTemplateFile(templateFile);
        return this;
    }

    public ExcelWriterBuilder withTemplate(String pathName) {
        return this.withTemplate(new File(pathName));
    }

2.2 填充模板

官方文档:填充Excel

注意:这里建议先去看下官方文档中给的示例,会比较好理解

在这里插入图片描述

  • 在模板中占位符用 {变量} 表示,比如 {name}{age}
    在这里插入图片描述
  • 如果占位符为列表,则使用 {.变量} 表示,比如:{.name}{.age}
    在这里插入图片描述

进行填充的方法为:fill()

    public ExcelWriter fill(Object data, WriteSheet writeSheet) {
        return this.fill((Object)data, (FillConfig)null, writeSheet);
    }

    public ExcelWriter fill(Object data, FillConfig fillConfig, WriteSheet writeSheet) {
        this.excelBuilder.fill(data, fillConfig, writeSheet);
        return this;
    }

    public ExcelWriter fill(Supplier<Object> supplier, WriteSheet writeSheet) {
        return this.fill((Object)supplier.get(), (FillConfig)null, writeSheet);
    }

    public ExcelWriter fill(Supplier<Object> supplier, FillConfig fillConfig, WriteSheet writeSheet) {
        this.excelBuilder.fill(supplier.get(), fillConfig, writeSheet);
        return this;
    }

EasyExcel 中,FillConfig 类用于配置单元格填充相关的设置。

以下是一些 FillConfig 类中常用的配置项:

  • forceNewRow:是否强制写入到新行。当设置为 true 时,每次写入都会创建新的行,而不是在现有行上进行覆盖
  • direction:填充方向,可以指定是水平填充还是垂直填充
    • 属性:
      • WriteDirectionEnum.VERTICAL:垂直填充
      • WriteDirectionEnum.HORIZONTAL:水平填充

如果有多列组合填充的情况,通过 {前缀.变量} 的形式区分不同的列表,例如

使用 FillWrapper 构建 Excel 写入时的填充模板

			...
			
            excelWriter.fill(new FillWrapper("data1", data()), writeSheet);
            excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
            excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
            
            ...

三、代码示例

简单介绍了 easyexcel 如何使用模板进行导出,接下来就通过几个简单的案例进行演示

以下案例使用的模板文件均可在文章顶部下载


3.1 案例一:工资表

编写 excel 模板:

在这里插入图片描述

实体类:

StaffSalaryEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StaffSalaryEntity {

    @ApiModelProperty(value = "姓名")
    private String name;

    @ApiModelProperty(value = "职称")
    private String post;

    @ApiModelProperty(value = "月薪")
    private BigDecimal mouthSalary;

    @ApiModelProperty(value = "时薪")
    private BigDecimal hourSalary;

    @ApiModelProperty(value = "应出勤天数")
    private Double shouldAttend;

    @ApiModelProperty(value = "出勤天数")
    private Double actualAttend;

    @ApiModelProperty(value = "平时加班时数")
    private Double overtime;

    @ApiModelProperty(value = "周末加班时数")
    private Double weekOvertime;

    @ApiModelProperty(value = "国假天数")
    private Double holiday;

    @ApiModelProperty(value = "正班薪资")
    private BigDecimal normalSalary;

    @ApiModelProperty(value = "平时加班薪资")
    private BigDecimal overtimeSalary;

    @ApiModelProperty(value = "周末加班薪资")
    private BigDecimal weekOvertimeSalary;

    @ApiModelProperty(value = "国假薪资")
    private BigDecimal holidaySalary;

    @ApiModelProperty(value = "岗位津贴")
    private BigDecimal postSubsidy;

    @ApiModelProperty(value = "全勤补贴")
    private BigDecimal fullAttendSubsidy;

    @ApiModelProperty(value = "全勤奖")
    private BigDecimal award;

    @ApiModelProperty(value = "事假缺勤扣款")
    private BigDecimal deduction;

    @ApiModelProperty(value = "社保费用")
    private BigDecimal social;

    @ApiModelProperty(value = "应得薪资")
    private BigDecimal shouldSalary;

    @ApiModelProperty(value = "个人扣税")
    private BigDecimal selfTax;

    @ApiModelProperty(value = "实发薪资")
    private BigDecimal actualSalary;

    @ApiModelProperty(value = "员工签名")
    private BigDecimal sign;
}

实体类中的字段要跟模板中占位符中的变量对应

代码示例:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.mike.server.system.domain.excel.ProductOfferExcelEntity;
import com.mike.server.system.entity.StaffSalaryEntity;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class TestDemo {

    /**
     * 案例一:工资表
     */
    @Test
    public void salaryList() {
        // 模板文件路径
        String templateFilePath = "D:\\excel-files\\gzb-template.xlsx";
        // 输出文件路径
        String outFilePath = "D:\\excel-files\\gzb.xlsx";

        // 创建 ExcelWriter 实例
        ExcelWriter writer = EasyExcel
                // 写入到
                .write(outFilePath)
                // 指定模板
                .withTemplate(templateFilePath)
                .build();

        WriteSheet sheet = EasyExcel.writerSheet().build();

        // 获取员工工资数据
        List<StaffSalaryEntity> staffSalaryEntities = getStaffSalaryEntities();

        FillConfig fillConfig = FillConfig.builder()
                // 开启填充换行
                .forceNewRow(true)
                .build();

        // 执行填充操作
        writer.fill(staffSalaryEntities, fillConfig, sheet);

        // 结束
        writer.finish();
    }

    public List<StaffSalaryEntity> getStaffSalaryEntities() {
        List<StaffSalaryEntity> list = new ArrayList<>();

        list.add(StaffSalaryEntity.builder()
                .name("米大傻")
                .post("开发")
                .mouthSalary(new BigDecimal(1320))
                .hourSalary(new BigDecimal("7.59"))
                .shouldAttend(21.0)
                .actualAttend(21.0)
                .overtime(21.0)
                .weekOvertime(8.0)
                .holiday(0.0)
                .normalSalary(new BigDecimal(1320))
                .overtimeSalary(new BigDecimal("238.97"))
                .weekOvertimeSalary(new BigDecimal("242.76"))
                .holidaySalary(new BigDecimal(0))
                .postSubsidy(new BigDecimal(0))
                .award(new BigDecimal(20))
                .deduction(new BigDecimal(0))
                .social(new BigDecimal("113.6"))
                .shouldSalary(new BigDecimal("1688.12"))
                .selfTax(new BigDecimal(0))
                .actualSalary(new BigDecimal("1688.1"))
                .build());


        list.add(StaffSalaryEntity.builder()
                .name("曹大力")
                .post("店长")
                .mouthSalary(new BigDecimal(13200))
                .hourSalary(new BigDecimal("7.59"))
                .shouldAttend(21.0)
                .actualAttend(21.0)
                .overtime(21.0)
                .weekOvertime(8.0)
                .holiday(0.0)
                .normalSalary(new BigDecimal(1320))
                .overtimeSalary(new BigDecimal("238.97"))
                .weekOvertimeSalary(new BigDecimal("242.76"))
                .holidaySalary(new BigDecimal(0))
                .postSubsidy(new BigDecimal(0))
                .award(new BigDecimal(20))
                .deduction(new BigDecimal(0))
                .social(new BigDecimal("113.6"))
                .shouldSalary(new BigDecimal("13200.12"))
                .selfTax(new BigDecimal(0))
                .actualSalary(new BigDecimal("13200.1"))
                .build());

        list.add(StaffSalaryEntity.builder()
                .name("张大仙")
                .post("经理")
                .mouthSalary(new BigDecimal(13200))
                .hourSalary(new BigDecimal("7.59"))
                .shouldAttend(21.0)
                .actualAttend(21.0)
                .overtime(21.0)
                .weekOvertime(8.0)
                .holiday(0.0)
                .normalSalary(new BigDecimal(1320))
                .overtimeSalary(new BigDecimal("238.97"))
                .weekOvertimeSalary(new BigDecimal("242.76"))
                .holidaySalary(new BigDecimal(0))
                .postSubsidy(new BigDecimal(0))
                .deduction(new BigDecimal(0))
                .social(new BigDecimal("113.6"))
                .shouldSalary(new BigDecimal("13200.12"))
                .selfTax(new BigDecimal(0))
                .actualSalary(new BigDecimal("13200.1"))
                .build());

        return list;
    }
}

展示:

在这里插入图片描述


3.2 案例二:报价单

编写模板:

在这里插入图片描述

模板文件放在项目的 resources 目录下的 templates/excel 文件夹下

在这里插入图片描述

实体类:

OfferDetailEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OfferDetailEntity {

    @ApiModelProperty(value = "公司名称")
    private String companyName;

    @ApiModelProperty(value = "报价日期")
    private String offerDate;

    @ApiModelProperty(value = "报价有效期")
    private String offerValidDate;

    @ApiModelProperty(value = "客户名称")
    private String customerName;

    @ApiModelProperty(value = "客户地址")
    private String customerAddress;

    @ApiModelProperty(value = "联系方式")
    private String contact;

    @ApiModelProperty(value = "合计数量")
    private Integer totalQty;

    @ApiModelProperty(value = "合计金额")
    private BigDecimal totalAmount;
}

ProductOfferEntity.java

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductOfferEntity {

    @ApiModelProperty(value = "产品名称")
    private String productName;

    @ApiModelProperty(value = "型号及规格")
    private String typeSpec;

    @ApiModelProperty(value = "数量")
    private Integer quantity;

    @ApiModelProperty(value = "单价")
    private BigDecimal price;

    @ApiModelProperty(value = "金额")
    private BigDecimal amount;

    @ApiModelProperty(value = "备注")
    private String remark;

}

代码示例:

TestController.java

    @GetMapping("/export/by-template")
    @ApiOperation(value = "导出-按模板格式", produces = "application/octet-stream")
    public ResponseBean<String> exportByTemplate(HttpServletResponse response) {
        testService.exportByTemplate(response);
        return ResponseBean.success();
    }

TestService.java

    /**
     * 导出-按模板格式
     */
    void exportByTemplate(HttpServletResponse response);

TestServiceImpl.java

    @SneakyThrows
    @Override
    public void exportByTemplate(HttpServletResponse response) {

        ServletOutputStream out = response.getOutputStream();

        EasyExcelUtil.initResponse(response, "报价单");

        // 文件模板输入流,将 excel 模板放到 resources 目录下
        InputStream templateFile = new ClassPathResource("templates/excel/bjd.xlsx").getInputStream();

        ExcelWriter writer = EasyExcel
                .write(out)
                .withTemplate(templateFile)
                .build();

        WriteSheet sheet = EasyExcel.writerSheet().build();

        /*
        HashMap<String, Object> offerDetail = new HashMap<>();
        offerDetail.put("companyName", "多加辣科技");
        offerDetail.put("offerDate", "2024-04-07");
        offerDetail.put("offerValidDate", "2024-04-11");
        offerDetail.put("customerName", "米大傻");
        offerDetail.put("customerAddress", "广东省广州市");
        offerDetail.put("contact", "078-182****4568");
        offerDetail.put("totalQty", 5);
        offerDetail.put("totalAmount", new BigDecimal(10300));
        */

        OfferDetailEntity offerDetail = OfferDetailEntity.builder()
                .companyName("多加辣科技")
                .offerDate("2024-04-07")
                .offerValidDate("2024-04-11")
                .customerName("米大傻")
                .customerAddress("广东省广州市")
                .contact("078-182****4568")
                .totalQty(5)
                .totalAmount(new BigDecimal(10300))
                .build();

        // 填充普通占位符
        // 这里 data 使用对象或者 Map 都可以
        writer.fill(offerDetail, sheet);

        List<ProductOfferEntity> list = new ArrayList<>();
        list.add(ProductOfferEntity.builder()
                .productName("电脑")
                .typeSpec("联想")
                .price(new BigDecimal(5000))
                .quantity(2)
                .amount(new BigDecimal(10000))
                .build());
        list.add(ProductOfferEntity.builder()
                .productName("鼠标")
                .typeSpec("联想")
                .price(new BigDecimal(100))
                .quantity(3)
                .amount(new BigDecimal(300))
                .build());

        // 填充配置,开启组合填充换行
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();

        // 填充列表占位符
        writer.fill(list, fillConfig, sheet);

        //填充完成
        writer.finish();

    }

相关工具类:

EasyExcelUtil.java

package com.mike.common.core.utils.excel;

import com.mike.common.core.constant.DateFormatConstant;
import com.mike.common.core.utils.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class EasyExcelUtil {

    /**
     * 初始化响应体
     * @param response 请求头
     * @param fileName 导出名称
     */
    public static void initResponse(HttpServletResponse response, String fileName) {
    	// 最终文件名:文件名_(截止yyyy-MM-dd)  --> 这块地方得根据你们自己项目做更改了
        String finalFileName = fileName + "_(截止"+ StringUtils.getNowTimeStr(DateFormatConstant.Y0M0D)+")";
        // 设置content—type 响应类型
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        try {
            // 这里URLEncoder.encode可以防止中文乱码
            finalFileName = URLEncoder.encode(finalFileName, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setHeader("Content-disposition", "attachment;filename=" + finalFileName + ".xlsx");
    }
}

测试:

在这里插入图片描述

在这里插入图片描述


四、我所遇到的问题

(1)驼峰命名导致填充数据失败

我在编写工资条案例时,最开始的模板如下:

在这里插入图片描述

导出效果:

在这里插入图片描述

数据都有,但是导出的表格中有些字段填充失败

这个我也不知道具体原因是为什么,不过测了几组数据之后,得出以下结论:

如果占位符中的变量采用的是驼峰命名的方式,且组成变量的 “单词” 存在过于简单的时就会出现该状况,比如说:

月薪的占位符 {.mSalary} 中的 mSalary 是由 msalary 组成,m 只有一个字母, {.mSalary} 填充不上,但是如果单独使用 {.m} 或者 {.salary} 却可以填充上去,或者把每个组成的单词写复杂一点,比如写成 {.mouthSalary} 也是可以填充上的

解决方案:要么就不要用驼峰命名,要么驼峰命名就写规范点,不要简写

(3)模板单元格样式消失

如果你使用模板导出发现有些单元格的样式消失了,比如:

在这里插入图片描述

这是因为在 write() 方法中添加了表格头的 class 对象

在这里插入图片描述

通过模板导出的方式不需要设置这个类对象,去掉即可

        ExcelWriter writer = EasyExcel
                .write(out)
                .withTemplate(templateFile)
                .build();



参考文章:

easyexcel导出excel表格:https://blog.csdn.net/qq_57732418/article/details/136944211

SpringBoot集成阿里EasyExcel导出excel高级实战:https://blog.csdn.net/Blueeyedboy521/article/details/128257388

springboot 使用 EasyExcel 通过模板导出EXCEL 带多个动态列表:https://www.cnblogs.com/guanxiaohe/p/17719954.html

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

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

相关文章

无尽加班何时休--状态模式

1.1 加班&#xff0c;又是加班&#xff01; 公司的项目很急&#xff0c;所以要求加班。经理把每个人每天的工作都排得满满的&#xff0c;说做完就可以回家&#xff0c;但是没有任何一个人可以在下班前完成的&#xff0c;基本都得加班&#xff0c;这就等于是自愿加班。我走时还有…

查看Linux系统相关信息

注&#xff1a; 本文只是博主学习记录分享&#xff0c;仅供参考。如有错误肯定是博主理解有问题&#xff0c;谢谢&#xff01; 一、查看当前操作系统的内核信息 命令&#xff1a;uname -a 二、查看当前操作系统版本信息 命令&#xff1a;cat /proc/version 这条命令可以查看到…

Your file appears not to be a valid OLE2 document

前言 org.apache.poi.poifs.filesystem.NotOLE2FileException:Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document解决 Excel兼容模式打开老版本文件造成文件损坏&#xff0c;大多说的是点…

OPC UA遇见chatGPT

最近opc 基金会将召开一个会议&#xff0c;主题是”OPC UA meets IT“。由此可见&#xff0c;工业自动化行业也开始研究和评估chatGPT带来的影响了。 本文谈谈本人对OPC UA 与chatGPT结合的初步实验和思考。 构建OPC UA 信息模型 chatGPT 的确非常强大了&#xff0c;使用自然…

Redis 主从复制、哨兵模式、Cluster集群

目录 一、Redis 主从复制 1、主从复制介绍 2、主从复制的作用 3、主从复制流程&#xff1a; 4、搭建redis主从复制 4.1所有服务器搭建redis数据库 4.2修改Redis配置文件&#xff08;Master节点操作&#xff09; ​4.3修改Redis配置文件&#xff08;slave节点操作&#x…

如何搭建企业级MQ消息集成平台

企业级MQ消息集成平台的重要性在于实现不同系统之间的高效、可靠、实时的消息传递和数据交换。它可以帮助企业实现系统解耦&#xff0c;提高系统的可扩展性和灵活性&#xff0c;降低系统间的依赖性。通过消息队列中间件&#xff0c;企业可以实现异步通信、削峰填谷、流量控制等…

Mysql底层原理七:InnoDB 行记录

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

基于支持 GPT 的服务的初创公司

Kafkai&#xff1a;多语言长篇内容生成&#xff0c;AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现&#xff0c;技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势&#xff0c;而是一种趋势。 它已成为科技行业的基石&#xff0c…

PCA算法(Principal Component Analysis)揭秘

经典PCA算法 PCA算法的应用包括降维、有损数据压缩、特征抽取、数据可视化等。目前PCA算法有两个通用定义&#xff0c;能殊途同归&#xff0c;得到相同的结果。一方面&#xff0c;我们可以用正交投影来定义PCA&#xff0c;即将数据投影到更低维的线性子空间&#xff0c;也被称…

一文2700字使用 JMeter 进行灵活的接口自动化测试!

简介&#xff1a; JMeter 是一个开源的负载测试工具&#xff0c;它可以模拟多种协议和应用程序的负载&#xff0c;包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时&#xff0c;使用 JMeter 可以帮助我们快速地构建测试用例&#xff0c;模拟多种场景&#…

Windows:IntelliJ IDEA Ultimate 安装 PHP 插件

在 IntelliJ IDEA Ultimate 中安装 PHP 插件&#xff0c;支持PHP开发调试 首先&#xff0c;进入File > Setting&#xff1a; 再次选择Plugins&#xff0c;然后选择上面的 Marketplace。 在搜索栏中输入 PHP&#xff0c;然后单击左侧的 Install 进行安装就可以了。 安装成功…

文档管理系统解决方案(word原件)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 数据备份技术 3.系统功能设计 3.1.功能清单列表 3.2.基础数据管理 3.3.位置管理 3.4.文档使用 3.5.文档管理 软件全套资料包获取方式①&#xff1a;软件项…

HarmonyOS实战开发DLP-如何实现一个安全类App。

介绍 本示例是一个安全类App&#xff0c;使用ohos.dlpPermission 接口展示了在eTS中普通文件加密受限的过程。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添加一个普通文件; 2.长按点击加密按钮&#xff0c;出现加密权限弹窗&#xff0c;选择需要设置的权限并点击确定…

高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1

文章目录 问题解决步骤 问题 因为需要用到gdb一些指令&#xff0c;但是gdb8.x好像存在普遍的问题&#xff0c;实现不了某些指令&#xff0c;比方说set detach-on-fork on&#xff0c;升级版本也没有比较好的教程 经过我不断的试错&#xff0c;我终于升级成功了&#xff01;&a…

项目中 使用 spring cache redis 出现大量keys* 慢查询排查以及修复

前言 业务反馈 redis里有大量的慢查询 而且全是keys 的命令 排查 首先登录 阿里云查看redis的慢查询日志 如下 主要使用到redis cache的注解功能 分别是 CacheEvict 和 Cacheable 注意 CacheEvict 这个比较特殊 会进行驱逐缓存 说白就会删除缓存或者让缓存失效 第一时间想…

内网穿透的应用-如何使用Docker本地部署Dify LLM结合内网穿透实现公网访问本地开发平台

文章目录 1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify&#xff01; Dify 是一款…

10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他

从事自媒体运营光靠自己手动操作效率是非常低的&#xff0c;想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具&#xff0c;觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…

多叉树题目:子树中标签相同的结点数

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;子树中标签相同的结点数 出处&#xff1a;1519. 子树中标签相同的结点数 难度 5 级 题目描述 要求 给你一个树&#xff08;即一个连通的无向无环图…

2024年中国金融科技(FinTech)行业发展洞察报告

核心摘要&#xff1a; 金融监管体系的改革推动金融科技行业进入超级监管时代&#xff0c;数据要素应用与金融场景建设成为如今行业关注的重要领域&#xff0c;为金融机构提供以业务需求为导向的技术服务成为“厚积成势”阶段行业发展的新目标&#xff0c;市场参与者的“业技融…

峥嵘九载,逐云而上:青果乔迁新址,乘风破浪再起新篇

4月1日&#xff0c;近百名员工和诸多合作伙伴齐聚&#xff0c;共同见证了青果九周年庆典暨乔迁仪式这一里程碑式的时刻。 新起点&#xff0c;新征程&#xff0c;再启航&#xff01; 以新为序&#xff0c;共赴新征程 在典礼上&#xff0c;青果创始人和高管分别发表了致辞&#…