EasyExcel(环境搭建以及常用写入操作)

文章目录

  • EasyExcel环境搭建
    • 1.创建模块 easyexcel-demo
    • 2.引入依赖
    • 3.启动类创建
  • EasyExcel写
    • 1.最简单的写入
        • 1.模板
        • 2.方法
        • 3.结果 Write01.xlsx
    • 2.指定字段不写入Excel
        • 1.模板
        • 2.方法
        • 3.结果 Write02.xlsx
    • 3.指定字段写入excel
        • 1.模板
        • 2.方法
        • 3.结果 Write03.xlsx
    • 4.按照index顺序写入excel
        • 1.模板
        • 2.方法
        • 3.结果 Write04.xlsx
    • 5.复杂头数据写入,合并单元格
        • 1.模板
        • 2.方法
        • 3.结果 Write05.xlsx
    • 6.写入数据到不同的sheet中
        • 1.模板
        • 2.方法
        • 3.结果 Write06.xlsx
    • 7.日期数字格式化
        • 1.模板
        • 2.方法
        • 3.结果 Write07.xlsx
    • 8.写入图片到Excel
        • 1.模板
        • 2.方法
        • 3.结果 Write08.xlsx
    • 9.通过注解形式设置写入Excel样式
        • 1.模板
        • 2.方法
        • 3.结果 Write09.xlsx
    • 10.应用自定义转换器
        • 1.模板
        • 2.自定义转换器
        • 3.方法
        • 4.结果 Write10.xlsx

EasyExcel环境搭建

1.创建模块 easyexcel-demo

CleanShot 2024-10-30 at 14.43.41@2x

2.引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>

    <groupId>com.sunxiansheng</groupId>
    <artifactId>easyexcel-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

3.启动类创建

package com.sunxiansheng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Description: 启动类
 *
 * @Author sun
 * @Create 2024/10/29 11:19
 * @Version 1.0
 */
@SpringBootApplication
public class ExcelApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExcelApplication.class, args);
    }
}

EasyExcel写

1.最简单的写入

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public static class Write01 {
        @ExcelProperty(value = "用户编号")
        private Integer userId;
        @ExcelProperty(value = "姓名")
        private String userName;
        @ExcelProperty(value = "性别")
        private String gender;
        @ExcelProperty(value = "工资")
        private Double salary;
        @ExcelProperty(value = "入职时间")
        private Date hireDate;
    }
2.方法
    /**
     * 最简单的写入
     */
    @Test
    public void testWrite01() {
        String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write01.xlsx";
        // 1.构建write,指定写入的文件路径
        ExcelWriter excelWriter = EasyExcel.write(fileName)
                .build();
        // 2.构建sheet,指定sheetName和模板
        WriteSheet writeSheet = EasyExcel.writerSheet()
                .sheetName("用户信息")
                .head(Write01.class)
                .build();
        // 3.构造数据
        List<Write01> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Write01 user = Write01.builder()
                    .userId(i)
                    .userName("admin" + i)
                    .gender(i % 2 == 0 ? "女" : "男")
                    .salary(i * 1000.00)
                    .hireDate(new Date())
                    .build();
            list.add(user);
        }
        // 4.write向sheet中写入数据
        excelWriter.write(list, writeSheet);
        // 5.关闭流
        excelWriter.finish();
    }
3.结果 Write01.xlsx

CleanShot 2024-10-30 at 14.58.58@2x

2.指定字段不写入Excel

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public static class Write02 {
        @ExcelProperty(value = "用户编号")
        private Integer userId;
        @ExcelProperty(value = "姓名")
        private String userName;
        @ExcelProperty(value = "性别")
        private String gender;
        @ExcelProperty(value = "工资")
        private Double salary;
        @ExcelProperty(value = "入职时间")
        private Date hireDate;
    }
2.方法

CleanShot 2024-10-30 at 15.03.32@2x

    /**
     * 指定字段不写入excel
     */
    @Test
    public void testWrite02() {
        String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write02.xlsx";
        // 1.构建write,指定写入的文件路径
        ExcelWriter excelWriter = EasyExcel.write(fileName)
                .build();
        // 2.构建sheet,指定sheetName和模板
        WriteSheet writeSheet = EasyExcel.writerSheet()
                .sheetName("用户信息")
                .head(Write02.class)
                .excludeColumnFieldNames(Arrays.asList("salary", "hireDate")) // 排除字段
                .build();
        // 3.构造数据
        List<Write02> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Write02 user = Write02.builder()
                    .userId(i)
                    .userName("admin" + i)
                    .gender(i % 2 == 0 ? "女" : "男")
                    .salary(i * 1000.00)
                    .hireDate(new Date())
                    .build();
            list.add(user);
        }
        // 4.write向sheet中写入数据
        excelWriter.write(list, writeSheet);
        // 5.关闭流
        excelWriter.finish();
    }
3.结果 Write02.xlsx

CleanShot 2024-10-30 at 15.04.08@2x

3.指定字段写入excel

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public static class Write03 {
        @ExcelProperty(value = "用户编号")
        private Integer userId;
        @ExcelProperty(value = "姓名")
        private String userName;
        @ExcelProperty(value = "性别")
        private String gender;
        @ExcelProperty(value = "工资")
        private Double salary;
        @ExcelProperty(value = "入职时间")
        private Date hireDate;
    }
2.方法
/**
 * 指定字段写入excel
 */
@Test
public void testWrite03() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write03.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write03.class)
            .includeColumnFieldNames(Arrays.asList("salary", "hireDate")) // 包含字段
            .build();
    // 3.构造数据
    List<Write03> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write03 user = Write03.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? "女" : "男")
                .salary(i * 1000.00)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write03.xlsx

CleanShot 2024-10-30 at 15.14.07@2x

4.按照index顺序写入excel

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public static class Write04 {
        @ExcelProperty(value = "用户编号", index = 0)
        private Integer userId;
        @ExcelProperty(value = "姓名", index = 1)
        private String userName;
        @ExcelProperty(value = "性别", index = 3)
        private String gender;
        @ExcelProperty(value = "工资", index = 4)
        private Double salary;
        @ExcelProperty(value = "入职时间", index = 2)
        private Date hireDate;
    }
2.方法
/**
 * 按照index顺序写入excel
 */
@Test
public void testWrite04() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write04.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write04.class)
            .build();
    // 3.构造数据
    List<Write04> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write04 user = Write04.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? "女" : "男")
                .salary(i * 1000.00)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write04.xlsx

CleanShot 2024-10-30 at 15.17.05@2x

5.复杂头数据写入,合并单元格

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public static class Write05 {
        @ExcelProperty(value = {"group1", "用户编号"})
        private Integer userId;
        @ExcelProperty(value = {"group1", "姓名"})
        private String userName;
        @ExcelProperty(value = {"group2", "性别"})
        private String gender;
        @ExcelProperty(value = {"group2", "工资"})
        private Double salary;
        @ExcelProperty(value = "入职时间")
        private Date hireDate;
    }
2.方法
/**
 * 复杂头数据写入,合并单元格
 */
@Test
public void testWrite05() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write05.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write05.class)
            .build();
    // 3.构造数据
    List<Write05> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write05 user = Write05.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? "女" : "男")
                .salary(i * 1000.00)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write05.xlsx

CleanShot 2024-10-30 at 15.22.53@2x

6.写入数据到不同的sheet中

1.模板
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public static class Write06 {
    @ExcelProperty(value = "用户编号")
    private Integer userId;
    @ExcelProperty(value = "姓名")
    private String userName;
    @ExcelProperty(value = "性别")
    private String gender;
    @ExcelProperty(value = "工资")
    private Double salary;
    @ExcelProperty(value = "入职时间")
    private Date hireDate;
}
2.方法
/**
 * 写入数据到不同的sheet中
 */
@Test
public void testWrite06() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write06.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.循环创建十个sheet,并分别写入数据
    for (int j = 0; j < 10; j++) {
        // 创建sheet
        WriteSheet writeSheet = EasyExcel.writerSheet()
                .sheetName("用户信息" + j)
                .head(Write06.class)
                .build();
        // 3.构造数据
        List<Write06> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Write06 user = Write06.builder()
                    .userId(i)
                    .userName("admin" + i)
                    .gender(i % 2 == 0 ? "女" : "男")
                    .salary(i * 1000.00)
                    .hireDate(new Date())
                    .build();
            list.add(user);
        }
        // 4.write向sheet中写入数据
        excelWriter.write(list, writeSheet);
    }
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write06.xlsx

CleanShot 2024-10-30 at 15.30.52@2x

7.日期数字格式化

1.模板
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public static class Write07 {
    @ExcelProperty(value = "用户编号")
    private Integer userId;
    @ExcelProperty(value = "姓名")
    private String userName;
    @ExcelProperty(value = "性别")
    private String gender;
    @ExcelProperty(value = "工资")
    @ContentStyle(dataFormat = 2) // 保留两位小数
    private Double salary;
    @ExcelProperty(value = "入职时间")
    @DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒") // 日期格式化
    private Date hireDate;
}
2.方法
/**
 * 日期数字格式化
 */
@Test
public void testWrite07() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write07.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write07.class)
            .build();
    // 3.构造数据
    List<Write07> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write07 user = Write07.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? "女" : "男")
                .salary(i * 1000.213214234)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write07.xlsx

CleanShot 2024-10-30 at 15.42.52@2x

8.写入图片到Excel

1.模板
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@ContentRowHeight(value = 100) // 内容行高
@ColumnWidth(value = 20) // 列宽
static class Write08 {
    // 使用抽象文件表示一个图片
    @ExcelProperty(value = "File类型")
    private File file;
    // 使用输入流保存一个图片
    @ExcelProperty(value = "InputStream类型")
    private InputStream inputStream;
    // 当使用String类型保存一个图片的时候需要使用StringImageConverter转换器
    @ExcelProperty(value = "String类型", converter = StringImageConverter.class)
    private String str;
    // 使用二进制数据保存为一个图片
    @ExcelProperty(value = "二进制数据(字节)")
    private byte[] byteArr;
    // 使用网络链接保存为一个图片
    @ExcelProperty(value = "网络图片")
    private URL url;
}
2.方法
    /**
     * 写入图片到Excel
     */
    @Test
    public void testWrite08() throws Exception {
        String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write08.xlsx";
        // 本地图片
        String imagePath = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/th.jpeg";
        // 网络图片
        URL url = new URL("https://cn.bing.com/th?id=OHR.TanzaniaBeeEater_ZH-CN3246625733_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp");
        // 构建writer
        ExcelWriter excelWriter = EasyExcel.write(fileName)
                .build();
        // 构建sheet
        WriteSheet writeSheet = EasyExcel.writerSheet()
                .head(Write08.class)
                .sheetName("图片信息")
                .build();
        // 构建data
        // 将图片读取到byte数组中
        byte[] bytes = new byte[(int) new File(imagePath).length()];
        InputStream inputStream = new FileInputStream(imagePath);
        inputStream.read(bytes, 0, bytes.length);

        List<Write08> imageDataList = new ArrayList<>();

        // 创建数据模板
        Write08 imageData = Write08.builder()
                .file(new File(imagePath)) // File类型
                .inputStream(new FileInputStream(imagePath)) // InputStream类型
                .str(imagePath) // String类型
                .byteArr(bytes) // 二进制数据
                .url(url) // 网络图片
                .build();
        // 添加要写入的图片模型
        imageDataList.add(imageData);
        // 写入数据
        excelWriter.write(imageDataList, writeSheet);
        // 关闭流
        excelWriter.finish();
    }
3.结果 Write08.xlsx

CleanShot 2024-10-30 at 15.51.33@2x

9.通过注解形式设置写入Excel样式

1.模板
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    @HeadRowHeight(value = 30) // 头部行高
    @ContentRowHeight(value = 25) // 内容行高
    @ColumnWidth(value = 20) // 列宽
    // 头字体设置成20, 字体默认宋体
    @HeadFontStyle(fontName = "宋体", fontHeightInPoints = 20)
    // 内容字体设置成20, 字体默认宋体
    @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
    public static class Write09 {
        @ExcelProperty(value = "用户编号")
        private Integer userId;
        // 字符串的头字体设置成20
        @HeadFontStyle(fontHeightInPoints = 30)
        // 字符串的内容字体设置成20,默认宋体
        @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
        @ExcelProperty(value = "姓名")
        private String userName;
        @ExcelProperty(value = "性别")
        private String gender;
        @ExcelProperty(value = "工资")
        private Double salary;
        @ExcelProperty(value = "入职时间")
        private Date hireDate;
    }
2.方法
/**
 * 通过注解形式设置写入Excel样式
 */
@Test
public void testWrite09() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write09.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write09.class)
            .build();
    // 3.构造数据
    List<Write09> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write09 user = Write09.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? "女" : "男")
                .salary(i * 1000.00)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
3.结果 Write09.xlsx

CleanShot 2024-10-30 at 15.57.32@2x

10.应用自定义转换器

1.模板
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public static class Write10 {
    @ExcelProperty(value = "用户编号")
    private Integer userId;
    @ExcelProperty(value = "姓名")
    private String userName;
    @ExcelProperty(value = "性别", converter = GenderConverter.class) // 使用自定义转换器
    private Integer gender;
    @ExcelProperty(value = "工资")
    private Double salary;
    @ExcelProperty(value = "入职时间")
    private Date hireDate;
}
2.自定义转换器
/**
 * 自定义转换器,比如数据库中0代表男,1代表女,导出到Excel中需要转换为男和女,注意,需要是public类型的
 */
public static class GenderConverter implements Converter<Integer> {

    private static final String MALE = "男";
    private static final String FEMALE = "女";

    /**
     * Java类型是Integer
     *
     * @return
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    /**
     * Excel类型是String
     *
     * @return
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 写入Excel时,将Integer类型的数据转换为String类型
     *
     * @param value
     * @param contentProperty
     * @param globalConfiguration
     * @return
     * @throws Exception
     */
    @Override
    public WriteCellData<?> convertToExcelData(Integer value,
                                               ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) throws Exception {
        // 根据整数值返回对应的性别字符串
        String gender;
        switch (value) {
            case 0:
                gender = MALE;
                break;
            case 1:
                gender = FEMALE;
                break;
            default:
                gender = "未知";
        }
        // 返回转换后的 Excel 单元格数据
        return new WriteCellData<>(gender);
    }

    /**
     * 读取Excel时,将String类型的数据转换为Integer类型
     *
     * @param cellData
     * @param contentProperty
     * @param globalConfiguration
     * @return
     * @throws Exception
     */
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 获取Excel的值
        String cellDataStringValue = cellData.getStringValue();
        // 转换为Java的值
        switch (cellDataStringValue) {
            case MALE:
                return 0; // 男,返回0
            case FEMALE:
                return 1; // 女,返回1
            default:
                return -1; // 其他,返回-1
        }
    }
}
3.方法
/**
 * 应用自定义转换器
 */
@Test
public void testWrite10() {
    String fileName = "/Users/sunxiansheng/IdeaProjects/demo/easyexcel-demo/src/main/resources/Write10.xlsx";
    // 1.构建write,指定写入的文件路径
    ExcelWriter excelWriter = EasyExcel.write(fileName)
            .build();
    // 2.构建sheet,指定sheetName和模板
    WriteSheet writeSheet = EasyExcel.writerSheet()
            .sheetName("用户信息")
            .head(Write10.class)
            .build();
    // 3.构造数据
    List<Write10> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        Write10 user = Write10.builder()
                .userId(i)
                .userName("admin" + i)
                .gender(i % 2 == 0 ? 1 : 0) // 这里插入的是数字,使用自定义转换器转换为男和女
                .salary(i * 1000.00)
                .hireDate(new Date())
                .build();
        list.add(user);
    }
    // 4.write向sheet中写入数据
    excelWriter.write(list, writeSheet);
    // 5.关闭流
    excelWriter.finish();
}
4.结果 Write10.xlsx

CleanShot 2024-10-30 at 16.10.28@2x

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

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

相关文章

SpringBoot对静态资源的映射规则

目录 什么是SpringBoot静态资源映射&#xff1f; 如何实现SpringBoot静态资源映射&#xff1f; 1. webjars&#xff1a;以jar包的方式引入静态资源 示例&#xff1a; 2. /** 访问当前项目的任何资源 示例一&#xff1a; 示例二&#xff1a; 3. 静态首页&#xff08;欢…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义&#xff1a;令牌&#xff0c;访问资源接口&#xff08;API&#xff09;时所需要的资源凭证 一、Access Token 定义&#xff1a;访问资源接口&#xff08;API&#xff09;时所需要的资源凭证&#xff0c;存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

集成RabbitMQ+MQ常用操作

文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…

CMSeasy;大米CMS漏洞复现

一、越权漏洞 pikachu-Over permission 水平越权 ⽔平越权&#xff1a;指攻击者尝试访问与他拥有相同权限的⽤户资源。 登录lucy 查看lucy个人信息 在lucy页面修改usernamelili 可以跳转lili的个人信息页面 pikachu-Over permission 垂直越权 垂直越权&#xff1a;通过低权…

【HarmonyOS之旅】ArkTS语法(一)

目录 1 -> 基本UI描述 1.1 -> 基本概念 1.2 -> UI描述规范 1.2.1 -> 无参数构造配置 1.2.2 -> 必选参数构造配置 1.2.3 -> 属性配置 1.2.4 -> 事件配置 1.2.5 -> 子组件配置 2 -> 状态管理 2.1 -> 基本概念 2.2 -> 页面级变量的状…

论文解读 | NeurIPS'24 Lambda:学习匹配先验以处理无标记垂悬问题场景下的实体对齐任务...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 尹航&#xff0c;上海交通大学博士生 内容简介 我们研究了带有无标记悬挂问题的实体对齐&#xff08;EA&#xff09;任务&#xff0c;即部分实体在另一个…

Midjourney技术浅析(五):图像细节处理

Midjourney 作核心目标之一是生成高质量、高分辨率且细节丰富的图像。为了实现这一目标&#xff0c;Midjourney 采用了超分辨率&#xff08;Super-Resolution&#xff09;和细节增强&#xff08;Detail Enhancement&#xff09;技术。本文将深入探讨 Midjourney 的超分辨率与细…

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

C++第五六单元测试

1【单选题】在公有派生类的成员函数不能直接访问基类中继承来的某个成员&#xff0c;则该成员一定是基类中的&#xff08; C &#xff09;。&#xff08;2.0分&#xff09; A、公有成员B、保护成员C、私有成员D、保护成员或私有成员 注意从类外访问与从派生类中访问 2【单…

vscode实用插件(持续更新)

目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比&#xff0c;方便代码评审&#xff01;解决了为了一个问题而多次commit&#xff0c;导致代码不好评审&#xff0c;即不晓得和远程分支相比&#xff0…

MySQL第二弹----CRUD

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;MySQL &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 一、修改表 使用ALTER …

Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】

第一种思路是先将它们都转换为小写或大写&#xff0c;再使用String类的startsWith()方法实现: 例如&#xff0c;如下的二个示例&#xff1a; "Session".toLowerCase().startsWith("sEsSi".toLowerCase()); //例子之一//例子之二String str "Hello Wo…

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; ----------…

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

【Linux进程】进程信号(信号的保存与处理)

目录 前言 1. 信号的默认行为 2. 信号的保存 信号集操作函数 sigprocmask sigpending 3. 信号的处理 信号的处理过程 思考 4. sigaction 5. SIGCHLD信号 6. 可重入函数 7. volatile 总结 前言 上文介绍了信号&#xff0c;以及信号的产生&#xff0c;本文继续来聊一…

论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》

Abstract 通过将时间序列编码为数字组成的字符串&#xff0c;我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法&#xff0c;我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…

Llama系列关键知识总结

系列文章目录 第一章&#xff1a;LoRA微调系列笔记 第二章&#xff1a;Llama系列关键知识总结 文章目录 系列文章目录Llama: Open and Efficient Foundation Language Models关键要点LLaMa模型架构&#xff1a;Llama2分组查询注意力 (GQA) Llama3关键信息 引用&#xff1a; Ll…

项目实践-贪吃蛇小游戏

目录 声明 1、前言 2、实现目标 3、技术要点 4、Win32API介绍 4.1、Win32API 4.2、控制台程序 4.3、控制台屏幕上的坐标COORD 4.4、GetStdHandle 4.5、GetConsoleCursorInfo 4.6、SetConsoleCursorInfo 4.7、SetConsoleCursorPosition 4.8、GetAsyncKeyState 5、…

Java编程题_面向对象和常用API01_B级

Java编程题_面向对象和常用API01_B级 第1题 面向对象、异常、集合、IO 题干: 请编写程序&#xff0c;完成键盘录入学生信息&#xff0c;并计算总分将学生信息与总分一同写入文本文件 需求&#xff1a;键盘录入3个学生信息(姓名,语文成绩,数学成绩) 求出每个学生的总分 ,并…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT&#xff0c;给大家分享一下操作流程。 一、安装JMeter 参考文档&#xff1a;Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3&#xff0c;用到的插件是&#xff1a;mqtt-xmeter-2.0.2-jar-with-depe…