SpringBoot解析前端上传的Excel文件并导入数据库
创作时间:
作者:
@小白创作中心
SpringBoot解析前端上传的Excel文件并导入数据库
引用
CSDN
1.
https://blog.csdn.net/haduwi/article/details/111292886
一、准备工作
在开始解析Excel文件之前,需要在项目的pom.xml文件中添加Apache POI的相关依赖,以便能够解析Excel文件。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
此外,还需要准备一份Excel模板和相应的SQL数据库表。
二、优化点
为了提高代码的复用性和灵活性,将ExcelUtil工具类定义为泛型类。这样,ExcelUtil就可以解析任何Excel文件,并将其封装到相应的实体类中,最后将数据插入数据库。这种设计使得一个解析工具可以多次复用。
三、代码实现
1. Controller层
在Controller层,通过@PostMapping注解处理文件上传请求。使用MultipartFile接收上传的文件,并调用Service层的方法进行解析和导入数据库。
@PostMapping("/uploadExcel")
public Msg uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename(); // 获取文件名
InputStream is = null;
try {
is = file.getInputStream();
List<Map> studentList = studentService.getListByExcel(is, fileName); // 获取解析后的List集合
Boolean result = studentService.batchImportStuInfo(studentList); // 把数据插入数据库
if (result) {
return Msg.success().add("info", "文件上传成功!");
} else {
return Msg.failure().add("info", "文件上传失败!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
is.close();
}
return Msg.failure().add("info", "文件错误!");
}
2. Service层
在Service层,定义了两个主要方法:getListByExcel用于解析Excel文件,batchImportStuInfo用于批量导入数据到数据库。
public List<Map> getListByExcel(InputStream is, String fileName) throws IOException {
try {
List<Map> studentList = new ExcelUtil<>(new Student()).AnalysisExcel(is, fileName);
return studentList;
} catch (Exception e) {
e.printStackTrace();
}
return new ArrayList<>();
}
public Boolean batchImportStuInfo(List<Map> list) {
Integer flag = studentMapper.batchImportStuInfo(list);
if (flag > 0) {
return true;
} else return false;
}
3. Mapper层
Mapper层定义了一个接口,用于批量导入学生信息。
@Repository
@Mapper
public interface StudentMapper {
// 批量导入学生信息
Integer batchImportStuInfo(List<Map> studentList);
}
4. ExcelUtil工具类
ExcelUtil工具类是整个实现的核心,它使用泛型来解析Excel文件并将其封装到指定的实体类中。
public class ExcelUtil<T> {
private T t;
public ExcelUtil(T t) {
this.t = t;
}
public List<Map> AnalysisExcel(InputStream is, String fileName) throws IOException {
List<Map> list = new ArrayList<>();
Workbook workbook = createWorkbookByExcelType(is, fileName); // 创建工作簿
Sheet sheet = workbook.getSheetAt(0);
Row row = null;
int maxRowNum = sheet.getLastRowNum();
row = sheet.getRow(0);
int maxColNum = row.getLastCellNum();
List<String> arrayList = new ArrayList<>();
Field[] declaredFields = t.getClass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
String name = declaredFields[i].getName();
arrayList.add(name);
}
for (int i = 0; i <= maxRowNum; i++) {
Map<String, String> map = new HashMap<>();
row = sheet.getRow(i);
if (row != null) {
for (int j = 0; j < maxColNum; j++) {
String cellData = (String) getCellFormatValue(row.getCell(j));
map.put(arrayList.get(j), cellData);
}
list.add(map);
}
}
return list;
}
public static Workbook createWorkbookByExcelType(InputStream inputStream, String fileName) {
Workbook wb = null;
if (fileName == null) {
return null;
}
String extString = fileName.substring(fileName.lastIndexOf("."));
InputStream is = null;
try {
is = inputStream;
if (".xls".equals(extString)) {
return wb = new HSSFWorkbook(is);
} else if (".xlsx".equals(extString)) {
return wb = new XSSFWorkbook(is);
} else {
return wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return wb;
}
public static Object getCellFormatValue(Cell cell) {
Object cellValue = null;
if (cell != null) {
switch (cell.getCellType()) {
case NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case FORMULA:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = cell.getDateCellValue();
} else {
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
case STRING:
cellValue = cell.getRichStringCellValue().getString();
break;
default:
cellValue = "";
}
} else {
cellValue = "";
}
return cellValue;
}
}
5. Mapper.xml映射文件
在Mapper.xml文件中,定义了批量插入数据的SQL语句。
<insert id="batchImportStuInfo" parameterType="java.util.List">
insert into student values
<foreach item="item" collection="list" separator=",">
(
#{item.id},
#{item.stuName},
#{item.sex},
#{item.cardId},
#{item.stuId},
#{item.political},
#{item.major},
#{item.classGrade},
#{item.tel},
#{item.stuStatus}
#{item.city}
)
</foreach>
</insert>
6. application.yml配置文件
在application.yml文件中,配置了文件上传的大小限制。
spring:
servlet:
multipart:
max-file-size: 1000MB
max-request-size: 1000MB
四、代码分析
MultipartFile是Spring框架下的一个类,主要用于处理文件上传功能。它允许以表单的形式上传文件,是Spring项目中处理文件上传的常用方式。
五、效果展示
热门推荐
职场情商提升指南:5大技巧助你游刃有余
甘南美食必打卡:藏式火锅&石磨酸奶
早睡真的能救命!看路遥和郑渊洁的故事
7小时睡眠是效率之源:揭秘最佳睡眠时长
智能电视卡顿?15招让你秒变高手!
高效学习法,拯救你的心理健康!
国医大师黄瑾明:推崇食疗,擅用血肉有情之品
宜品小羊:国产羊奶粉的领军者,以科学配方和严格品控赢得市场认可
羊奶粉助消化,全家健康无忧
羊奶粉:妈妈再也不用担心我的消化啦!
十代思域音响调试全攻略:从基础调节到高级改装
白芨高产的关键:土壤特性与管理技术详解
高效安全防治白芨病虫害:敌百虫辛硫磷使用全攻略
EPB系统普及率超8成,下一代EMB技术蓄势待发
EPB系统:从便捷操作到自动驾驶,市场规模将破百亿
兔子饲料大揭秘:这样搭配才最健康!
新手养兔避坑指南:这些误区千万别犯!
圣诞节用松塔装饰,蕴含东西方文化共通的美好寓意
从种松到咏松:苏东坡与松树的不解之缘
芬兰二战中的复杂角色揭秘
冬季战争:芬兰的英雄时刻
告别电视卡顿,这些实用技巧请收好!
绍兴东湖景区:AAAA级旅游胜地,乌篷船游湖赏景,尽显江南水乡韵味
绍兴旅游攻略:品味古韵江南的韵味
甘南旅行必备:应对3000米高原的小技巧
甘南藏族自治州:高海拔美景与高原反应攻略
袁希福:用中医点亮癌症患者康复之路
秦朝兵器与现代武器:一场跨越时空的较量
轻松解决美佳视机顶盒故障:从电源到网络全面排查
轻松解决机顶盒网络连接问题:7个实用排查步骤