项目构建
pom.xml
代码语言:javascript复制<!-- 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下载(导出数据)
注意事项:复制全即可
前端
代码语言:javascript复制<a href="downExcel">下载链接</a>
后端代码
代码语言:javascript复制@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属性一致,
前端
代码语言:javascript复制<form action="upExcel" method="post" enctype="multipart/form-data">
Excel上传:<input type="file" name="file"/><input type="submit" value="submit">
</form>
后端
代码语言:javascript复制@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 "上传成功";
}