当前位置: 首页 > news >正文

Java使用FastExcel实现Excel文件导入

 依赖配置 (Maven pom.xml)

<dependencies><!-- FastExcel 核心库 --><dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.0.0</version></dependency><!-- Apache POI 依赖 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>
</dependencies>

映射实体类SetMealDetailsVo

package com.fantaibao.module.vo.appDish;import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.HeadFontStyle;
import cn.idev.excel.annotation.write.style.HeadStyle;
import cn.idev.excel.enums.BooleanEnum;
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
import com.fantaibao.module.po.DishAppManagementOriginal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;
import java.util.Date;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ExcelIgnoreUnannotated
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 22)
@HeadFontStyle(fontName = "Microsoft YaHei", fontHeightInPoints = 11, bold = BooleanEnum.TRUE)
public class SetMealDetailsVo {/*** 套餐ID*/@ColumnWidth(30)@ExcelProperty("套餐ID")private String code;/*** 标准套餐名称*/@ColumnWidth(30)@ExcelProperty("标准套餐名称")private String menuName;/*** 套餐定价*/private BigDecimal price;/*** 套餐定价*/@ColumnWidth(20)@ExcelProperty("套餐定价")private String priceStr;/*** 套餐毛利率(%)*/@ColumnWidth(20)@ExcelProperty("套餐毛利率(%)")private String grossMarginStr;/*** 毛利率(%)*/private BigDecimal grossMargin;/*** 明细菜编码*/@ColumnWidth(30)@ExcelProperty("明细菜编码")private String detailsCode;/*** 明细菜品名称*/@ColumnWidth(30)@ExcelProperty("明细菜品名称")private String detailsMenuName;/*** 明细菜单位*/@ColumnWidth(30)@ExcelProperty("明细菜品单位")private String detailsUnit;/*** 明细菜定价*/@ColumnWidth(20)@ExcelProperty("明细菜定价")private String detailsPriceStr;private BigDecimal detailsPrice;/*** 明细菜毛利率(%)*/@ColumnWidth(20)@ExcelProperty("明细菜毛利率(%)")private String detailsGrossMarginStr;/*** 明细菜毛利率(%)*/private BigDecimal detailsGrossMargin;/*** 明细菜分类*/@ColumnWidth(20)@ExcelProperty("明细菜分类")private String detailsClass;}

自定义监听器CustomSheetListener(带校验表头)

package com.fantaibao.listener;import cn.hutool.core.collection.CollUtil;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.read.listener.ReadListener;
import cn.idev.excel.util.StringUtils;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;@Slf4j
@Getter
@RequiredArgsConstructor
public class CustomSheetListener<T> implements ReadListener<T> {/*** 返回最终解析的数据*/private List<T> dataList;private List<String> fields;public CustomSheetListener(List<T> dataList, Class clazz) {this.dataList = dataList;this.fields = getFields(clazz);}/*** 根据class通过反射获取字段上@ExcelProperty注解的值** @param clazz 类名* @return 注解的值*/private static List<String> getFields(Class clazz) {List<String> fields = CollUtil.newArrayList();//根据class通过反射获取字段上@ExcelProperty注解的值Field[] declaredFields = clazz.getDeclaredFields();for (Field field : declaredFields) {ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);if (annotation != null) {String[] value = annotation.value();// 添加到列表中fields.addAll(Arrays.asList(value));}}return fields;}@Overridepublic void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {// 在这里检查表头是否正确for (Map.Entry<Integer, ReadCellData<?>> entry : headMap.entrySet()) {String headerValue = entry.getValue().getStringValue();// 根据你的需求检查表头值if (!isValidHeader(headerValue)) {throw new RuntimeException("模版错误,请重新上传");}}//if(!fields.isEmpty() && context.readSheetHolder().getHeadRowNumber()-1 == context.readSheetHolder().getRowIndex()){throw new RuntimeException("模版错误,请重新上传");}}@Overridepublic void invoke(T data, AnalysisContext context) {dataList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.info("excel解析完成,sheet名为:{}", context.readSheetHolder().getSheetName());}/**** @param header 表头名称* @return 是否存在 存在则移除掉*/private boolean isValidHeader(String header) {if (StringUtils.isBlank(header)) {return true;}if(this.fields.contains(header)){fields.removeIf(field->field.equals(header));return true;}return false;}
}

业务菜调用

//fileUrl是文件全路径(我这里是腾讯云OSS文件路径)
List<SetMealDetailsVo> setMealDetails = CollUtil.newArrayList();
try {EasyExcel.read(new URL(fileUrl).openStream(),SetMealDetailsVo.class,new CustomSheetListener(setMealDetails, SetMealDetailsVo.class)).sheet(0).doRead();
} catch (Exception e) {throw new RuntimeException("模版错误,请重新上传");
}

http://www.xdnf.cn/news/1138393.html

相关文章:

  • 镁合金汽车零部件市场报告:行业现状、发展趋势与投资前景分析
  • 集群聊天服务器各个类进行详解
  • Docker国内镜像
  • 关于用git上传远程库的一些常见命令使用和常见问题:
  • RuoYi-Cloud 定制微服务
  • Java集合框架中List常见问题
  • 【软件开发】主流 AI 编码插件
  • 服务器数据恢复—raid5磁盘阵列崩溃如何恢复数据?
  • 《每日AI-人工智能-编程日报》--2025年7月17日
  • Odoo最佳业务实践:从库存管理重构到全链路协同
  • Jmeter 性能测试响应时间过长怎么办?
  • 下载anaconda和pycharm,管理python环境
  • Kubernetes 学习笔记
  • 暑期自学嵌入式——Day05(C语言阶段)
  • MyBatis 之配置与映射核心要点解析
  • 三轴云台之测距算法篇
  • 硅谷顶级风投发布《2025年AI实战手册》|附下载
  • 【Elasticsearch】Elasticsearch 快照恢复 API 参数详解
  • 一次多架构镜像构建实战:Docker Buildx + Harbor 踩坑记录
  • arping(ARP协议网络测试工具)
  • ota之.加密算法,mcu加密方式
  • git基本操作【GIT-2】
  • 进阶向:智能图像背景移除工具
  • Java并发编程第三篇(深入解析Synchronized)
  • 2025年5大国产ETL工具横向评测
  • 20250717 Ubuntu 挂载远程 Windows 服务器上的硬盘
  • ROS1/Linux——Launch文件使用
  • 创建项目:使用Spring Initializr初始化你的第一个应用程序
  • display:flex弹性布局
  • 聊聊数据和功能测试面临的挑战有哪些?