📁 项目结构简述
ruoyi-flowable-plus
是基于 RuoYi 的扩展项目,使用:
- 后端:Spring Boot + MyBatis + Flowable
- 前端:Vue.js
📥 Excel 导入功能 Demo
以导入用户数据为例,展示完整导入流程。
✅ 后端实现(Java)
1. Maven 依赖(pom.xml)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
2. 控制器层(UserController.java)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/import")
public AjaxResult importUser(@RequestParam("file") MultipartFile file) {
try {
List<User> userList = userService.importExcel(file.getInputStream());
return AjaxResult.success("导入成功", userService.saveBatch(userList));
} catch (Exception e) {
return AjaxResult.error("导入失败:" + e.getMessage());
}
}
}
3. 服务层(UserService.java)
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> importExcel(InputStream inputStream) throws Exception {
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
List<User> list = new ArrayList<>();
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
User user = new User();
user.setUserName(getCellValue(row, 0));
user.setNickName(getCellValue(row, 1));
user.setEmail(getCellValue(row, 2));
user.setPassword(getCellValue(row, 3));
list.add(user);
}
return list;
}
private String getCellValue(Row row, int cellIndex) {
Cell cell = row.getCell(cellIndex);
if (cell == null) return "";
return cell.toString();
}
public boolean saveBatch(List<User> list) {
return userMapper.insertBatch(list) > 0;
}
}
4. Mapper 层(UserMapper.java)
public interface UserMapper {
int insertBatch(@Param("list") List<User> list);
}
5. Mapper XML(UserMapper.xml)
<insert id="insertBatch">
INSERT INTO sys_user (user_name, nick_name, email, password)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.userName}, #{item.nickName}, #{item.email}, #{item.password})
</foreach>
</insert>
✅ 前端实现(Vue.js)
1. 页面组件(user/import.vue)
<template>
<div>
<el-upload
action="/api/user/import"
:headers="headers"
:on-success="handleSuccess"
:on-error="handleError"
:limit="1"
accept=".xlsx,.xls"
>
<el-button type="primary">导入Excel</el-button>
</el-upload>
</div>
</template>
<script>
export default {
data() {
return {
headers: {
Authorization: 'Bearer ' + this.$store.getters.token
}
};
},
methods: {
handleSuccess(response) {
this.$message.success("导入成功");
console.log(response);
},
handleError(error) {
this.$message.error("导入失败:" + error.message);
}
}
};
</script>
🧪 示例 Excel 表格格式
用户名 | 昵称 | 邮箱 | 密码 |
---|---|---|---|
admin | 管理员 | admin@example.com | 123456 |
user1 | 用户1 | user1@example.com | 123456 |
✅ 总结
模块 | 内容 |
---|---|
后端技术 | Spring Boot + MyBatis + Apache POI |
前端技术 | Vue + Element UI |
核心功能 | Excel 数据导入数据库 |
示例实体 | User 对象 |
示例接口 | /user/import |
提示:如需集成到其他模块(如部门、岗位、流程等),可复用此结构,仅需替换实体类和Mapper。