现在很多web应用中,导入excel导出excel很常见,这篇文章就讲讲导入excel文件。
以批量导入课程为例
首先加入需要的jar包
org.apache.poi
poi
RELEASE
org.apache.poi
poi-ooxml
RELEASE
数据库中创建一个表course
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`course_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '课程id',
`course_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '课程代码',
`course_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '课程名称',
`teacher_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '教师id',
`course_time` date NOT NULL DEFAULT '1996-01-01' COMMENT '开课时间',
`class_room` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '开课地点',
`course_week` int(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '课程学时',
`course_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '必修课' COMMENT '课程类型',
`college_id` int(11) UNSIGNED NOT NULL COMMENT '所属院系id',
`score` int(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '学分',
`is_on` tinyint(2) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否开启了选课,默认0未开启',
PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '课程表' ROW_FORMAT = Dynamic;
新建一个ExcelUtil.java
/**
* excel工具类
*/
public class ExcelUtils {
private static Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
/**
* 课程excel
* @param in
* @param fileName
* @return
* @throws Exception
*/
public static List getCourseListByExcel(InputStream in, String fileName) throws Exception {
List list = new ArrayList<>();
// 创建excel工作簿
Workbook work = getWorkbook(in, fileName);
if (null == work) {
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if(sheet == null) {
continue;
}
// 滤过第一行标题
for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if (row == null || row.getFirstCellNum() == j) {
continue;
}
List
这里主要注意一下上面的日期转换,在excel中的日期,通过Java读出来之后,变成了26 四月 2019这样的形式,而数据库中我们的字段类型为date,所以总是插入失败。
上面我的写法直接是知道那个字段是Date类型,所以直接使用y==3,这样写可复用性很差。
接下来直接看和数据库交互的逻辑代码
/**
* 通过excel文件,批量增加课程
* @param request
* @return
* @throws Exception
*/
@PostMapping("/upload/course")
public String uploadCourseExcel(HttpServletRequest request) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartHttpServletRequest.getFile("courseFile");
if(file.isEmpty()) {
return "redirect:/admin/course/list";
}
try {
InputStream inputStream = file.getInputStream();
List> list = ExcelUtils.getCourseListByExcel(inputStream, file.getOriginalFilename());
inputStream.close();
for (int i = 0; i < list.size(); i++) {
List
可以看到,我又对时间类型进行了处理,才能最终插入数据库
// 格式化时间
Date date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse(courseList.get(3).toString());
course.setCourseTime(new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(date)));
同时,在excel中的整数类型,取出来之后就会变成Double类型比如5变成5.0,所以我对此也进行了处理
course.setCourseWeek(Integer.parseInt(new DecimalFormat("0").format(Double.parseDouble(courseList.get(5).toString()))));
最后调用代码进行插入操作。
看看前端代码
这里我通过button唤醒一个模态框来添加