Spring框架下如何修改现有Excel文件并实现入库与导出?
嘿,我来帮你搞定这个需求!你已经有了导出Excel的基础,现在要实现「上传修改后的Excel→更新数据库→导出更新后文件」的完整流程,其实可以分成前端调整、后端Controller扩展、Service核心逻辑这几个部分来做,我给你详细拆解并附上可复用的代码示例:
实现步骤与代码示例
1. 前端页面调整(让用户能选择并提交修改后的Excel)
你需要给用户提供一个文件选择表单,支持上传.xlsx/.xls格式的文件,这里用Thymeleaf示例(纯HTML也类似):
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Excel数据同步</title> </head> <body> <h3>上传修改后的Excel文件</h3> <form method="post" enctype="multipart/form-data" th:action="@{/excel/upload-and-sync}"> <input type="file" name="excelFile" accept=".xlsx,.xls" required> <button type="submit">上传并导出更新后的文件</button> </form> </body> </html>
2. 扩展ExcelController处理上传与导出逻辑
在你现有的ExcelController里新增一个接口,负责接收上传文件、调用业务逻辑,最后返回更新后的Excel:
@Controller @RequestMapping("/excel") public class ExcelController { @Autowired private ContactsServiceI contactsService; // 你已有的Excel下载方法(保留原有逻辑即可) @GetMapping("/download") public void downloadExcel(HttpServletResponse response) throws IOException { // 你的原有导出代码 } // 新增:处理上传+更新数据库+导出更新后文件 @PostMapping("/upload-and-sync") public void uploadAndSyncExcel(@RequestParam("excelFile") MultipartFile excelFile, HttpServletResponse response) throws Exception { // 1. 基础校验:文件是否有效 if (excelFile.isEmpty() || !excelFile.getOriginalFilename().matches(".*\\.(xlsx|xls)$")) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请选择有效的Excel文件"); return; } // 2. 解析Excel并同步到数据库 List<Contacts> updatedContacts = contactsService.parseExcelAndSaveToDB(excelFile.getInputStream()); // 3. 生成并返回更新后的Excel文件 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment; filename=updated_contacts.xlsx"); contactsService.generateExcel(updatedContacts, response.getOutputStream()); } }
3. Service层核心逻辑实现(用EasyExcel简化操作)
推荐用阿里的EasyExcel来处理Excel读写(比Apache POI性能更好、代码更简洁),先添加Maven依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency>
第一步:给实体类添加Excel映射注解
确保你的Contacts实体类和Excel表头对应:
@Data public class Contacts { @ExcelProperty("联系人ID") // 和Excel表头文本一致 private Long id; @ExcelProperty("姓名") private String name; @ExcelProperty("联系电话") private String phone; // 其他业务字段... }
第二步:实现Service的核心方法
@Service @Transactional // 事务管理,避免部分数据保存成功、部分失败的情况 public class ContactsServiceImpl implements ContactsServiceI { @Autowired private ContactsMapper contactsMapper; // 解析Excel并同步到数据库 @Override public List<Contacts> parseExcelAndSaveToDB(InputStream inputStream) { // 读取Excel中的数据 List<Contacts> contactsList = EasyExcel.read(inputStream) .head(Contacts.class) .sheet() .doReadSync(); // 同步逻辑:根据ID更新现有数据,无ID则插入新数据(可根据你的需求调整) for (Contacts contact : contactsList) { if (contact.getId() != null) { contactsMapper.updateById(contact); // MyBatis-Plus的更新方法,原生MyBatis可写update语句 } else { contactsMapper.insert(contact); } } // 从数据库查询最新数据,确保导出的是准确的内容 return contactsMapper.selectList(null); } // 生成Excel文件 @Override public void generateExcel(List<Contacts> contactsList, OutputStream outputStream) { EasyExcel.write(outputStream, Contacts.class) .sheet("最新联系人列表") .doWrite(contactsList); } }
4. 关键注意事项
- 事务保障:添加
@Transactional注解,确保数据同步失败时自动回滚,避免脏数据。 - 数据校验:可以在解析Excel后添加校验逻辑(比如姓名/电话不能为空、格式合法),用JSR-380注解(
@NotBlank等)或自定义校验方法。 - 文件大小限制:在
application.properties中配置上传文件的大小限制:spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB - 异常处理:可以用
@ControllerAdvice全局捕获异常,返回友好的错误提示给前端。
内容的提问来源于stack exchange,提问作者andu
相关产品推荐
相关产品推荐

