唠嗑部分
用户投稿篇
本文会以案例代码的形式实现excel的导入导出,代码注释十分详细,请需要的小伙伴务必详细阅读
注意点:
1、本案例重点关注于如何使用jsp+servlet实现excel的导入导出,前端页面小白随便画的(意思是比较丑),没有专业的美工,主要是没必要画好看,哈哈哈
2、案例SQL均会在源代码中包含,请关注源代码->db目录
言归正传
数据库比较简单,初始化后创建两条数据
我们来说说本期实现的功能:
1、请求http://localhost:8080/user/getList进入用户列表首页,首页包含导入、导出按钮
2、点击导出,将全部用户数据导出至userlist.xls文件中
3、修改userlist.xls文件中的数据,将该文件中的用户数据导入至数据库
4、查看数据库,包含初始化数据+导出的数据即可
实现主要过程:
1、核心依赖
<!--excel相关依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2、封装Dao,使用jdbc封装两个方法,分别是查询所有数据,批量插入
对于jdbc的操作就不多说了,可参考文章:
3、创建Excel导出的Servlet,部分代码
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
List<User> userList = userDao.selectAll();
//创建HSSFWorkbook对象(excel的文档对象)
HSSFWorkbook wb = new HSSFWorkbook();
//建立新的sheet对象(excel的表单)
HSSFSheet sheet = wb.createSheet("用户数据表");
//在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
HSSFRow row1 = sheet.createRow(0);
//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
HSSFCell cell = row1.createCell(0);
//设置单元格内容
cell.setCellValue("用户数据一览表");
//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));
//在sheet里创建第二行
HSSFRow row2 = sheet.createRow(1);
//创建单元格并设置单元格内容
row2.createCell(0).setCellValue("用户编号");
row2.createCell(1).setCellValue("用户名");
row2.createCell(2).setCellValue("用户密码");
row2.createCell(3).setCellValue("用户年龄");
row2.createCell(4).setCellValue("创建时间");
int rowNum = 1;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (User user : userList) {
//循环在sheet创建行
HSSFRow rown = sheet.createRow(++rowNum);
rown.createCell(0).setCellValue(user.getId());
rown.createCell(1).setCellValue(user.getUsername());
rown.createCell(2).setCellValue(user.getPassword());
rown.createCell(3).setCellValue(user.getAge());
rown.createCell(4).setCellValue(format.format(user.getCreatetime()));
}
//输出Excel文件
OutputStream output = resp.getOutputStream();
// 设置附件响应头,浏览器会进行下载
resp.setHeader("Content-disposition", "attachment; filename=userlist.xls");
//响应正文的MIME类型,表示Excel
resp.setContentType("application/vnd.ms-excel");
wb.write(output);
output.close();
}
下图为代码与excel的对应关系,请知悉
4、创建Excel导入的Servlet,部分代码
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码字符集
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
Part file = req.getPart("file");
// 获取源文件名
String fileName = file.getSubmittedFileName();
InputStream is = file.getInputStream();
Workbook hssfWorkbook = null;
// 判断后缀名,分别处理
if (fileName.endsWith("xlsx")) {
hssfWorkbook = new XSSFWorkbook(is); //Excel 2007
} else if (fileName.endsWith("xls")) {
hssfWorkbook = new HSSFWorkbook(is); //Excel 2003
} else {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("文件类型暂不支持");
}
List<User> list = new ArrayList<User>();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 循环行Row,注意从第二行开始,第0行是标题,1行是表头
for (int rowNum = 2; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow != null) {
User user = new User();
Cell name = hssfRow.getCell(1);
Cell pwd = hssfRow.getCell(2);
Cell age = hssfRow.getCell(3);
Cell createStr = hssfRow.getCell(4);
user.setUsername(name.toString());
user.setPassword(pwd.toString());
Double d = new Double(age.getNumericCellValue());
user.setAge(d.intValue());
try {
user.setCreatetime(format.parse(createStr.toString()));
} catch (ParseException e) {
e.printStackTrace();
}
list.add(user);
}
}
int i = userDao.insertBatch(list);
System.out.println(i);
req.getRequestDispatcher("/user/getList").forward(req, resp);
}
}
注意两个for循环是在循环什么哈,别混淆了
5、功能测试
结语
1、功能实现了,完结撒花。
2、对于SpringBoot而言,并没有这么复杂,约定大于配置,已经帮我们做好了,有兴趣的小伙伴可以自行研究下。
3、源码及笔记获取方式还是老规矩,群文件自取。
4、制作不易,一键四连再走吧,您的支持永远是我最大的动力!
5、Java全栈技术交流群:941095490,欢迎你的加入!