SpringBoot导入excel

本文介绍了一个使用Spring框架处理Excel文件上传和解析的示例。通过一个控制器接收上传的Excel文件,并利用自定义的服务层进行文件上传和解析。解析后的数据被转换为VoExcel对象列表,便于进一步的数据处理和存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、controller:

@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public void importExcel(@RequestParam(value = "file", required = true) MultipartFile file) {
    baseService.importExcel(file);
}

2、service(UploadUtil和ExcelUtil工具类查看本人另外博客):

@Value("${spring.application.name}")
private String applicationName;
public String importExcel(MultipartFile file){
    Map map = UploadUtil.upload("/" + applicationName, file);
    String localFilePath = map.get("localFilePath").toString();
    List<VoExcel> VoList = ExcelUtil.importExcel(localFilePath, 0, 1, VoExcel.class);
    for (VoExcel vo: VoList) {

    }
    return "";
}
<think>我们被要求使用Spring Boot实现Excel文件导入功能。根据提供的引用,我们可以总结出几种常见的实现方式。下面将详细介绍实现步骤。 ### 1. 添加依赖 首先,在`pom.xml`文件中添加处理Excel的依赖。常用的库是Apache POI。 ```xml <!-- 操作excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> <!-- 版本可调整 --> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> ``` ### 2. 创建实体类 创建一个与Excel表格列对应的实体类,并使用注解来映射列名。例如,使用`@ExcelProperty`(来自EasyPoi)或直接使用POI的解析方式。这里我们展示两种方式: #### 方式一:使用POI(无注解) 这种方式需要手动解析每一行,并将单元格值赋给实体属性。 #### 方式二:使用EasyPoi(有注解) 引用[2]中使用了EasyPoi的`@Excel`注解(注意:引用[2]中使用了`@ExcelProperty`,但实际在EasyPoi中,通常使用`@Excel`注解)。需要添加EasyPoi依赖: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.1.3</version> <!-- 版本可调整 --> </dependency> ``` 实体类示例(使用EasyPoi注解): ```java import cn.afterturn.easypoi.excel.annotation.Excel; @Data public class Product { @Excel(name = "code") private String code; @Excel(name = "parent_code") private String parentId; @Excel(name = "type_name") private String typeName; } ``` ### 3. 编写Controller 创建一个Controller来处理文件上传请求。 #### 使用POI解析Excel(XSSF用于.xlsx,HSSF用于.xls) ```java import org.apache.poi.ss.usermodel.*; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @PostMapping("/import") public String importExcel(@RequestParam("file") MultipartFile file) { try { // 获取文件输入流 InputStream inputStream = file.getInputStream(); // 根据文件后缀创建Workbook Workbook workbook = WorkbookFactory.create(inputStream); // 获取第一个Sheet Sheet sheet = workbook.getSheetAt(0); // 遍历行(跳过标题行) for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); // 读取单元格 Cell cell0 = row.getCell(0); String code = cell0.getStringCellValue(); // ... 读取其他单元格并构建对象 // 保数据库 } workbook.close(); return "导入成功"; } catch (Exception e) { e.printStackTrace(); return "导入失败"; } } ``` #### 使用EasyPoi解析 ```java import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @PostMapping("/importByEasyPoi") public String importByEasyPoi(@RequestParam("file") MultipartFile file) { ImportParams params = new ImportParams(); params.setTitleRows(1); // 标题行,通常为第一行 params.setHeadRows(1); // 表头行,通常也是一行 try { List<Product> list = ExcelImportUtil.importExcel(file.getInputStream(), Product.class, params); // 遍历list,保数据库 return "导入成功,共导入" + list.size() + "条数据"; } catch (Exception e) { e.printStackTrace(); return "导入失败"; } } ``` ### 4. 前端上传文件 前端使用表单上传文件,例如: ```html <form method="post" action="/import" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="导入"> </form> ``` ### 5. 保数据库 在解析出对象列表后,调用Service层将数据保数据库。这里假设已经配置了Spring Data JPA。 ### 注意事项 1. 文件格式:处理不同版本的Excel文件(.xls和.xlsx)时,POI有不同的类(HSSF和XSSF),但使用`WorkbookFactory`可以自动适配。 2. 异常处理:确保捕获并处理可能的异常,如文件格式错误、空文件等。 3. 性能:对于大文件,可能需要分批次读取并保,避免内溢出。 4. 事务管理:如果导入过程中出现错误,可能需要回滚已插入的数据,可以考虑使用事务。 ### 示例项目结构 引用[3]和[4]展示了项目结构,通常包括: - 实体类(Entity) - 数据访问层(Repository) - 服务层(Service) - 控制器(Controller) 以上是Spring Boot实现Excel导入的基本步骤。具体实现细节可根据需求调整。 §§相关问题§§ 1. 如何处理Excel导入时的大文件问题? 2. Spring Boot中如何实现Excel文件的导出功能? 3. 使用EasyPoi和Apache POI各有什么优缺点? 4. 如何验证Excel导入数据的有效性?</think>### Spring Boot 实现 Excel 文件导入功能 在 Spring Boot 中实现 Excel 导入功能主要分为以下步骤: #### 1. 添加依赖 在 `pom.xml` 中添加 Apache POI 依赖(处理 Excel 文件): ```xml <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> ``` #### 2. 创建实体类 定义与 Excel 列对应的 Java 实体类: ```java @Data public class Product { @ExcelProperty("产品编码") // 表头名称 private String code; @ExcelProperty("上级编码") private String parentCode; @ExcelProperty("类型名称") private String typeName; } ``` #### 3. 实现导入控制器 ```java @RestController @RequestMapping("/excel") public class ExcelImportController { @Autowired private ProductService productService; @PostMapping("/import") public ResponseEntity<String> importExcel(@RequestParam("file") MultipartFile file) { try { // 1. 创建导入参数 ImportParams params = new ImportParams(); params.setTitleRows(1); // 表头占1行 // 2. 解析Excel数据 List<Product> productList = EasyExcel.read(file.getInputStream()) .head(Product.class) .sheet() .doReadSync(); // 3. 保数据库 productService.batchSaveProducts(productList); return ResponseEntity.ok("导入成功,共处理: " + productList.size() + " 条数据"); } catch (Exception e) { return ResponseEntity.status(500).body("导入失败: " + e.getMessage()); } } } ``` #### 4. 服务层实现 ```java @Service public class ProductServiceImpl implements ProductService { @Autowired private ProductRepository productRepository; @Transactional public void batchSaveProducts(List<Product> products) { productRepository.saveAll(products); } } ``` #### 5. 前端调用示例(HTML) ```html <form action="/excel/import" method="post" enctype="multipart/form-data"> <input type="file" name="file" accept=".xlsx, .xls"> <button type="submit">导入Excel</button> </form> ``` ### 关键注意事项 1. **文件格式处理**: - 支持 `.xlsx`(POI 的 XSSF)和 `.xls`(HSSF)格式 - 使用 `WorkbookFactory` 自动识别格式: ```java Workbook workbook = WorkbookFactory.create(inputStream); ``` 2. **大文件处理**: ```java // 分片读取(避免OOM) params.setReadRows(500); // 每次读取500行 ``` 3. **数据验证**: ```java @Data public class Product { @NotBlank(message = "编码不能为空") @ExcelProperty("产品编码") private String code; } ``` 4. **错误处理**: - 使用 `@ControllerAdvice` 全局异常处理 - 记录解析失败的行号和原因 ### 性能优化建议 1. 使用 `SXSSFWorkbook` 处理超大数据($>10^6$ 行) 2. 异步处理:`@Async` 注解实现后台导入 3. 批量提交:每 1000 条数据执行一次 JPA 批量保 4. 内管理:清理临时对象避免内泄漏 > **最佳实践**:对于复杂场景推荐使用 [EasyExcel](https://github.com/alibaba/easyexcel) 工具库,它通过 $O(1)$ 内模型解决大文件解析问题[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值