EasyExcel+MapStruct 实现导入导出

告别“大泥球”:我在 Spring Boot 单体架构中实践的模块化隔离 本文探讨了在电信网络优化系统中采用单体模块化架构而非微服务的原因。作者指出,该系统的核心需求是逻辑闭环而非并发扩展,因此采用"物理隔离、逻辑内聚"的策略。具体做法包括:按业务域垂直切分代码结构、实体类反映业务概念而非数据库结构、强制接口隔离为未来扩展留余地、通用功能下沉到公共模块、通过主题隔离实现低成本差异化等。作者建议维护者严守模块边界、逐步重构前端、定期清理公共模块,并强调架构选择应服务于业务需求,而非盲目追求技术时髦。这种模块化单体架构在强逻辑关联的网优系统中展现出更高的性价比和可 阅读详情

前置条件

了解mapStruct 可通过官网,或者我以前写的博客传送门:https://mapstruct.org/
若使用了 Lombok +MapStruct 注意版本问题

概览

  1. 使用MapStruct 可以减少导入导出 excel 与entity直接的不对应
  2. 使用 reflections 可以做到,枚举code -> 枚举名称的相互转换的问题。枚举管理类,实现code与name相互转换

更多看 gitee仓库:https://gitee.com/codingBug001/study-test.git

依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>easyExcel+lombok</description>
    
    <properties>
        <java.version>11</java.version>
        <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <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>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>
        <dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
            <version>0.9.11</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>

    </dependencies>

都是常用的依赖,没有什么好介绍的

写操作

vo对象


@Data
public class UserExportVo {

    @ColumnWidth(10)
    private String id;
    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名")
    private String name;

    /**
     * 年龄
     */
    @ExcelProperty(value = "年龄")
    private Integer age;

    /**
     * 邮箱
     */
    @ExcelProperty(value = "邮箱")
    @ColumnWidth(10)
    private String email;

    /**
     * 直属上级id
     */
    @ExcelProperty(value = "直属上级id")
    private String managerId;

    /**
     * 创建时间
     */
    @ExcelProperty(value = "创建时间")
    private Date createTime;

    /**
     * 修改时间
     */
    @ExcelProperty(value = "修改时间")
    private Date updateTime;

    /**时间戳*/
    @ExcelProperty(value = "时间戳")
    @DateTimeFormat("yyyy:MM:dd HH:mm:ss")
    private String timestamp;
}

** controller层**

 @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        List<UserExportVo> voList = userService.testMapStruct();

        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 设置样式
        WriteCellStyle headStyle = StyleUtils.getHeadStyle();
        WriteCellStyle contentStyle = StyleUtils.getContentStyle();
        HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(headStyle, contentStyle);

        EasyExcel.write(response.getOutputStream(), UserExportVo.class).sheet("模板").registerWriteHandler(styleStrategy).doWrite(voList);
    }

设置表头以及单元格样式


import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.*;

public class StyleUtils {

    public static WriteCellStyle getHeadStyle(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

        // 字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("黑体");//设置字体名字
        headWriteFont.setFontHeightInPoints((short)12);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;

        // 样式
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;


        headWriteCellStyle.setWrapped(true);  //设置自动换行;


        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;


        //        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

        return headWriteCellStyle;
    }

    public static WriteCellStyle getContentStyle(){
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();

        // 背景绿色
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

        // 设置字体
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 9);//设置字体大小
        contentWriteFont.setFontName("宋体"); //设置字体名字
        contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;

        //设置样式;
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;

        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        contentWriteCellStyle.setWrapped(true); //设置自动换行;

        contentWriteCellStyle.setDataFormat((short)49);//设置单元格格式是:文本格式,方式长数字文本科学计数法

        // contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

        return contentWriteCellStyle;
    }

}

mapStruct 的转换

** 定义接口**


import cn.hutool.core.util.ObjectUtil;
import com.zx.easy.enums.EnumManager;
import com.zx.easy.enums.LanguagesEnum;
import com.zx.easy.pojo.dto.UserReadDto;
import com.zx.easy.pojo.entity.User;
import com.zx.easy.pojo.vo.UserExportVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import java.util.List;

@Mapper(componentModel = "spring",uses = {StructHelper.class})
public interface MapStructConverter {



    @Mappings({
            @Mapping(source = "timestamp",target = "timestamp",qualifiedByName = StructConstant.TIME_MILLIS_TO_DATE_STR),
            @Mapping(target = "languages",expression = "java(getLanguagesEnum(entity))")
    })
    UserExportVo userToUserVo(User entity);
    
    List<UserExportVo> userListToVoList(List<User> userList);
    
    
    @Mappings({
            @Mapping(source = "timestamp",target = "timestamp",qualifiedByName = StructConstant.DATE_STR_TO_TIME_MILLIS),
            @Mapping(source = "createTime",target="createTime",qualifiedByName=StructConstant.DATE_STR_TO_LOCAL_DATE),
            @Mapping(source = "updateTime",target="updateTime",qualifiedByName=StructConstant.DATE_STR_TO_LOCAL_DATE)
    })
    User userVoToUserEntity(UserReadDto vo );

    List<User> userVoListToUserList(List<UserReadDto> voList);
    
    
    default  String getLanguagesEnum(User entity){
        if (ObjectUtil.isNull(entity.getLanguages())){
            return "";
        }
        
       return EnumManager.getCodeName(LanguagesEnum.class,entity.getLanguages());
    }
}




注意点
1-@Mapper注解是MapStruct的而不是MP的
2-虽然把这个注解交个了Spring管理。但是有的时候你使用的类,没有被Spring管理,此时 @Autowired 是没有的,为空可使用以下代码解决。

Mappers.getMapper(MapStructConverter.class).userVoListToUserList(list);

一句话:此转换器和 使用此转换器都被spring管理,可直接注入。否则使用上面代码。
转换工具类StructHelper


@Component
@Named(value = "StructHelper")
public class StructHelper {

    /**
     * 时间搓转换程日期格式
     * @param timeMillis
     * @return
     */
    @Named(value = StructConstant.TIME_MILLIS_TO_DATE_STR)
    public static String dateStrToTimeMillis(Long timeMillis) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(timeMillis);
    }


    @Named(value = StructConstant.DATE_STR_TO_TIME_MILLIS)
    public static Long timeMillisToDateStr(String dateStr) {
        long time1 = DateUtil.parseDateTime(dateStr).getTime();
        return time1;
    }

    @Named(value=StructConstant.DATE_STR_TO_LOCAL_DATE)
    public static LocalDateTime dateStrToLocalDateTime(String dateStr) {
        LocalDateTime localDateTime = DateUtil.parseLocalDateTime(dateStr);
        return localDateTime;
    }




}

为了方便点定义了常量** StructConstant**,

public class StructConstant {
    public static final String TIME_MILLIS_TO_DATE_STR ="timeMillisToDateStr";
    public static final String DATE_STR_TO_TIME_MILLIS ="dateStrToTimeMillis";

    public static final String DATE_STR_TO_LOCAL_DATE ="dateStrToLocalDateTime";
}

当然你若嫌麻烦,也可以不定义。使用 expression 以及 qualifiedByName也是一样的效果

    @Mappings({
            @Mapping(source = "timestamp",target = "timestamp",qualifiedByName = StructConstant.DATE_STR_TO_TIME_MILLIS),
            @Mapping(source = "createTime",target="createTime",qualifiedByName=StructConstant.DATE_STR_TO_LOCAL_DATE),
            // @Mapping(source = "updateTime",target="updateTime",qualifiedByName=StructConstant.DATE_STR_TO_LOCAL_DATE)
            @Mapping(source = "updateTime",target="updateTime",expression = "java()")
    })
    User userVoToUserEntity(UserReadDto vo );

导出效果

在这里插入图片描述

读操作

    @PostMapping("upload")
    public String upload(@RequestBody MultipartFile file) throws IOException {
       return userService.upload(file);
    }
    // service
    @Override
    public String upload(MultipartFile file) throws IOException {

        EasyExcel.read(file.getInputStream(), UserReadDto.class, new UploadDataListener(this)).sheet().doRead();
        return "success";

    }

UploadDataListener


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.dto.UserReadDto;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import com.example.demo.struct.MapStructConverter;
import lombok.extern.slf4j.Slf4j;
import org.mapstruct.factory.Mappers;

import java.util.ArrayList;
import java.util.List;

/**
 * 模板的读取类
 *
 * @author Jiaju Zhuang
 */
@Slf4j
public class UploadDataListener extends AnalysisEventListener<UserReadDto> {
    
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<UserReadDto> list = new ArrayList<UserReadDto>();
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private UserService userService;



    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param userService
     */
    public UploadDataListener(UserService userService) {
        this.userService = userService;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(UserReadDto data, AnalysisContext context) {
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }



    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.error("{}条数据,开始存储数据库!", list.size());
        List<User> userList = Mappers.getMapper(MapStructConverter.class).userVoListToUserList(list);
        // List<User> userList = mapStructConver.userVoListToUserList(list);
        userService.saveBatch(userList);
        log.info("存储数据库成功!");
    }
}

** dto对象**


@Data
public class UserReadDto {

    @ColumnWidth(10)
    private String id;
    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名")
    private String name;

    /**
     * 年龄
     */
    @ExcelProperty(value = "年龄")
    private Integer age;

    /**
     * 邮箱
     */
    @ExcelProperty(value = "邮箱")
    @ColumnWidth(10)
    private String email;

    /**
     * 直属上级id
     */
    @ExcelProperty(value = "直属上级id")
    private String managerId;

    /**
     * 创建时间
     */
    @ExcelProperty(value = "创建时间")
    private String createTime;

    /**
     * 修改时间
     */
    @ExcelProperty(value = "修改时间")
    private String updateTime;

    /**时间戳*/
    @ExcelProperty(value = "时间戳")
    @DateTimeFormat("yyyy:MM:dd HH:mm:ss")
    private String timestamp;

}

当然若,读取的内容,和实体没有区别,可以直接用entity类当做dto传入。然后就没有必要转来转去了。

Java实现企业级资产管理系统:从设计到部署的完整实践 企业级应用开发中,构建稳定、可维护的内部管理系统是常见需求。其核心在于对业务领域进行合理抽象,通过状态机和事件溯源等设计模式确保数据一致性与可追溯性。Java技术栈凭借其成熟的生态和面向对象特性,成为实现这类系统的优选方案。Spring Boot框架提供了快速构建RESTful API的能力,而MyBatis-Plus则在复杂数据操作与灵活控制之间取得了良好平衡。结合RBAC权限模型与JWT认证,可以构建安全可靠的后台服务。这些技术最终服务于资产全生命周期管理、动态属性扩展、盘点统计等具体业务场景,为自研轻 阅读详情

相关推荐

Spring Boot智慧养老系统:架构设计与业务实现全解析

企业级应用开发中,Spring Boot框架凭借其‘约定大于配置’的理念和开箱即用的特性,已成为构建稳健后端服务的首选。其核心原理在于通过自动配置、内嵌容器和丰富的Starter依赖,极大简化了传统Java EE应用的繁琐配置,使开发者能聚焦于业务逻辑实现。这一技术价值在需要高数据一致性、复杂业务流程和严格安全控制的系统中尤为凸显,例如智慧养老这类数字化管理平台。通过Spring Boot,可以高效实现老人信息管理、床位分配、护理记录和费用结算等核心模块,并利用其生态集成数据验证、安全控制及监控功能。本文以

weixin_30663839的博客 311

SpringBoot使用EasyExcel将Excel表数据导入到数据库笔记

EasyExcel是一款阿里开源的Excel导入导出工具,具有处理快速、占用内存小、使用方便的特点,在Github上已有22k+Star,可见其非常流行。EasyExcel读取75M(46W行25列)的Excel,仅需使用64M内存,耗时20s,极速模式还可以更快!execl表的工作表是默认名字sheet1,没有修改 ...

qq_53121751的博客 3194

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

SpringBoot+EasyExcel实现Excel导入功能

SpringBoot+EasyExcel实现Excel导入功能 需求:需要把一个Excel大文件的数据存入数据库。 技术:SpringBoot + EasyExcel + Postman 1、加入EasyExcel依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <a

君莫笑 2134

IsaacLab从入门到精通(二) 导入自定义机器人

IsaacLab系列第二讲,导入自定义的机器人及设置

DejaWu33的博客 8464

vcs覆盖率相关

选择要查看的覆盖率点,右键选择 show xxx tests;

qq_40571921的博客 2387

java集成EasyExcel实现导入导出

3.解析excel,将文件从MultipartFile转换为File,然后调用EasyExcel的Read方法,去插入数据库,插入数据库这一步是在监听器中完成,我这里是使用将MultipartFile文件中的内容,复制到一个file文件中,然后再进行读取,需要在最后去进行删除,不然会在本地留一个文件,删除的时候不能立即删除,会删除失败,因为插入数据库还在进行,所以需要一个延时任务,这里是使用了线程池,让一个单独的线程去完成的插入,另一个线程等待删除,主线程则是直接返回。

weixin_56632323的博客 393

GraphRAG 踩坑记录

GraphRAG踩坑记录

yufanwenshu的博客 4350

springboot整合easyexcel

springboot整合easy excel 1、环境准备 创建springboot项目,导入jar包 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</gr...

plmzaqokn11的博客 1064

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1096

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

EasyExcel读写Excel内容

1.导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beat1</version> </dependency> 2.测试往Excel写入内容 @Test public void simpleWrite() { Stri

qq_45611467的博客 696

【系统分析师】2025年下半年真题:案例分析-答案及详解(回忆版)

Redis相比Memcached在电商高并发场景下具有显著优势:支持持久化(RDB/AOF)、丰富数据结构(如有序集合实现排行榜)、原生支持集群和哨兵模式(高可用性)。布隆过滤器通过位数组和哈希函数预先存储所有合法订单ID,当查询请求到达时快速拦截无效ID(如伪造ID),避免其穿透缓存直接冲击数据库,从而预防缓存击穿问题。

数据知道的博客 5982

使用EasyExcel(2.2.6)分页导出数据

前段时间用了下最新版本的esayExcel做了excel导出,发现想比以前,复杂的导入导出优化了不少,导入导出都是一行代码直接搞定.但是数据量大的时候一次查询过多数据库耗时过长容易造成网关超时等等问题,所以都是分页查询之后导出到一个表上。

SuperDragonyan的博客 4882

Python爬虫实战:实时爬取东方财富网股票行情

东方财富网实时行情(价格、涨跌幅、成交量等)K线图、分时图、技术指标市盈率、换手率、总市值等指标相比某些收费API,东方财富网页端接口不需要登录、免费、响应快、封装清晰,适合爬虫实践。东方财富网股票数据接口分析实时数据抓取与字段提取数据结构化处理自动化批量抓取多线程加速采集数据可视化展示支持存储为CSV/Excel/数据库。

2201_76125261的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

EasyExcel实现导出功能

EasyExcel导出自定义列 1.首先定义导出的列 entity: public class OrderExcelBO extends BaseRowModel { /** *index:显示在第几列的下标值 *value值是数组,写两个显示两行标题,如果两个字段第一个标题一样则显示两个字段总的标题 */ @ExcelProperty(value = {"订单号","订单ID"}, index = 0) private String id; @ExcelP

Clsrm的博客 6787

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用EasyExcel导入表格来进行批量插入数据----后端实现

1.创建一个实体类对应表格中的字段: @Data @EqualsAndHashCode public class RepositoryExcel { private Long safeTypeId; private Integer quesType; private String quesContent; private String options; private String answer; } 2.创建数据监听器: 注意:需要使用set方法把Sp

qq_45968950的博客 2289

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

工作必备|Java 高频方法详解(实体拷贝 + Stream+EasyExcel)

本文介绍了Java开发中三个高频实用方法:1. 实体类映射的三种方案对比:推荐Spring BeanUtils用于简单场景,MapStruct适用于复杂映射;2. Stream流collect方法构建Map的实战技巧,包括处理重复key和null值问题;3. EasyExcel模板导出的高效实现,支持多sheet填充和复杂格式报表生成。每种方法都结合实际案例、性能对比和常见问题解决方案,帮助开发者提升编码效率和代码质量。

weixin_66243333的博客 1363

总结java研发过程中一些实用的工具/类/方法/特性

动态方案的缺陷在于大量的反射调用,性能比较差,内存占用多,不适合特别高并发的应用场景。业务常用的方式是@Slf4j带的日志,不会有上面的风险,先定义一个Logger,然后支持不同级别的输出如fine()/info()/error()等。线上机器部署多个集群的时候,流量大的时候一定能打到某个机器,访问量不多的时候,比如预发就两台机器pods,从webshell进入,这个时候请求负载均衡不确定路由到哪一台,可以两边都开着,然后监听访问,区分读还是写的请求,如果是读接口,可以多点几下,肯定有一些会路由到的。

攻城狮不是猫 802

easyexce报表导入导出(代码版)

easyexce报表导入导出 无模板导入 @GetMapping("/upload") public StandardResult getUserRole(@RequestParam(value = "file", required = true) MultipartFile file){ try { if (null==file){ return StandardResult.faild("参数错误!");

qq_37945621的博客 295

easyExcel导出一直报错org.apache.poi.ss.usermodel.Cell.setCellValue(Ljava/time/LocalDateTime

easyexcel日期格式转换;其他属性字段转换。

weixin_45716265的博客 5096

@ExcelIgnoreUnannotated 和 @AutoMapper 详解

注解作用使用场景效果控制 Excel 导出导出报表、下载数据只导出明确标记的字段控制对象转换实体类 ↔ Vo 类转换自动生成属性复制代码。

2301_81920327的博客 204

Spring Boot + Vue3 实现图书馆管理系统图书信息录入全流程

数据录入是信息管理系统的核心基础,其健壮性直接关系到后续所有业务流程的稳定。从技术原理上看,一个完整的数据录入流程涉及前端表单交互、后端接口校验、数据库事务控制等多个层面。在工程实践中,开发者需要关注数据校验、批量处理、异常回滚等关键细节,以确保数据的准确性和一致性。以图书馆管理系统为例,图书信息录入不仅是简单的增删改查,更是一个涵盖单条录入、批量导入、数据校验与日志记录的综合性工程任务。本文基于Spring Boot和Vue3技术栈,深入探讨如何构建一个企业级的图书信息录入解决方案,其中涉及到的**数据校

weixin_34194087的博客 333

SpringBoot+Vue学生信息管理系统:从项目实战到全栈技能进阶

在Web应用开发领域,前后端分离架构已成为主流实践模式,其核心原理在于将用户界面与业务逻辑解耦,通过API进行数据交互。这种架构模式的技术价值在于提升开发效率、便于团队协作和实现更好的可维护性。在众多应用场景中,学生信息管理系统作为一个经典的业务模型,常被用作全栈开发的入门练手项目。它涵盖了用户认证、数据管理、文件操作等典型功能模块,是理解CRUD操作、RESTful API设计以及工程化思维的绝佳载体。本文以SpringBoot和Vue技术栈为例,深入探讨如何将此类项目从简单的“交差工具”转化为深入理解*

weixin_33895695的博客 348

基于Spring Boot的电脑硬件资产管理系统:从零构建企业IT资产管理平台

企业IT资产管理是提升运营效率、保障资产安全的关键环节,其核心在于对硬件设备全生命周期的数字化追踪与状态管理。通过引入Spring Boot这一高效Java框架,开发者能够快速构建稳定、可扩展的后台管理系统,实现资产信息的集中化、流程的规范化。这种技术方案的价值在于将传统分散、手工的资产管理模式升级为自动化、可视化的在线平台,有效解决了信息孤岛、盘点困难等痛点。在实际应用中,此类系统广泛服务于各类企业的IT部门,用于管理电脑、服务器等硬件资产的入库、领用、维修、报废等核心流程。本文以项目实例hx5416为引

weixin_30263073的博客 417
上一篇: idea 2020.3阅读模式(reader mode)调节字体大小
下一篇: mybatis if标签 test语句 Cause: java.lang.NumberFormatException: For input string:
一个大泥球
博客等级 码龄9年 41粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值