项目构建
项目下载
pom.xml
<!-- EXCEL下载 poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <!-- Excel读取 /poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <!-- commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
Excel下载(导出数据)
注意事项:复制全即可
前端
<a href="downExcel">下载链接</a>
后端代码
@RequestMapping("/downExcel") public String downExcel(HttpServletRequest request, HttpServletResponse response) throws Exception { String path = ResourceUtils.getURL("classpath:").getPath(); System.out.println(path); // 创建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, 3)); // 在sheet里创建第二行 HSSFRow row2 = sheet.createRow(1); // 创建单元格并设置单元格内容 row2.createCell(0).setCellValue("姓名"); row2.createCell(1).setCellValue("班级"); row2.createCell(2).setCellValue("笔试成绩"); row2.createCell(3).setCellValue("机试成绩"); // 在sheet里创建第三行 HSSFRow row3 = sheet.createRow(2); row3.createCell(0).setCellValue("李明"); row3.createCell(1).setCellValue("As178"); row3.createCell(2).setCellValue(87); row3.createCell(3).setCellValue(78); // .....省略部分代码 // 输出Excel文件 OutputStream output = response.getOutputStream(); response.reset(); response.setHeader("Content-disposition", "attachment; filename=details.xls"); response.setContentType("application/msexcel"); wb.write(output); output.close(); return null; }
Excel上传(导入数据)
注意事项:
代码:controller层里应该放service层,可以把excel的逻辑代码根据实际情况处理一下,本文没有处理
前端:post请求
enctype属性必须写,否则出现出现空指针异常
name="file" 必须和controller里面的方法的参数命名一致
后端: 方法参数必须和前端的 文件域里的name属性一致,
前端
<form action="upExcel" method="post" enctype="multipart/form-data"> Excel上传:<input type="file" name="file"/><input type="submit" value="submit"> </form>
后端
@RequestMapping("/upExcel") @ResponseBody public String upExcel(MultipartFile file) throws Exception { if (file == null || file.isEmpty()) { return "文件不能为空"; } // 获取Excel的输出流 InputStream inputStream = file.getInputStream(); // 获取文件名称 String fileName = file.getOriginalFilename(); // init工作簿 Workbook workbook = null; // 获取文件后缀 String fileType = fileName.substring(fileName.lastIndexOf(".")); // 根据不同后缀init不同的类,是xls还是xlsx if (".xls".equals(fileType)) { workbook = new HSSFWorkbook(inputStream); } else if (".xlsx".equals(fileType)) { workbook = new XSSFWorkbook(inputStream); } else { workbook = null; return "请上传正确的表格文件"; } // 如果上传为费excel文件,返回 if (null == workbook) { return "请上传文件"; } // init Sheet sheet = null; Row row = null; Cell cell = null; // 定义读取的容器 List list = new ArrayList<>(); for (int i = 0; i < workbook.getNumberOfSheets(); i++) { sheet = workbook.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<Object> li = new ArrayList<>(); for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(cell); } list.add(li); } } // 关闭流 workbook.close(); inputStream.close(); for (int i = 0; i < list.size(); i++) { List<Object> lo = (List<Object>) list.get(i); // TODO 随意发挥 System.out.println(lo); } return "上传成功"; }