spring-boot导入excel
本文使用Apache POL实现excel文档的导入解析
pom.xml 添加Apache POL依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
导入excel
使用表单上传excel文件,然后使用Apache POL来解析上传的excel文件,以下几个api比较重要
- 获取文件上传input的流:
InputStream fis = excelFile.getInputStream()
- 将文件流读入excel工作薄:
HSSFWorkbook workbook = new HSSFWorkbook(fis)
- 读取工作薄中的第一张表:
HSSFSheet sheet = workbook.getSheetAt(0);
- 读取表的第一行序号:
int firstRow = sheet.getFirstRowNum()
- 读取表的最后一行序号:
int lastRow = sheet.getLastRowNum()
- 读取表的一行:
HSSFRow row = sheet.getRow(i)
- 读取行的一列:
HSSFCell cell = row.getCell(j)
- 读取一行中的第一列序号:
int firstCell = row.getFirstCellNum()
- 读取一行中的最后一列序号:
int lastCell = row.getLastCellNum()
- 读取单元格中的数据:
String val =cell.getStringCellValue()
需要注意的一点,当单元格是数字格式时,需要把它的cell type转成String,否则会出错
if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
下面是全部代码
package com.example.demo.controller;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class Excel2Controller {
//上传文件的接口
@PostMapping(value = "/excel/import")
public List<Map<String,String>> excelImport(@RequestParam(value = "excelFile") MultipartFile excelFile) throws Exception{
if(excelFile==null){
throw new Exception("请选择文件");
}
InputStream fis = excelFile.getInputStream(); //读取input流
List<Map<String,String>> data = parseExcel(fis);
return data;
}
//解析excel
private List<Map<String,String>> parseExcel(InputStream fis) throws Exception{
List<Map<String,String>> data = new ArrayList<Map<String,String>>();
HSSFWorkbook workbook = new HSSFWorkbook(fis);
HSSFSheet sheet = workbook.getSheetAt(0);
int firstRow = sheet.getFirstRowNum();//第一行序号
int lastRow = sheet.getLastRowNum();//最后一行序号
HSSFRow titleRow = sheet.getRow(firstRow);//表头行
for(int i=firstRow+1;i<lastRow+1;i++){
HSSFRow row = sheet.getRow(i); //获取第行
Map map = getRowData(row,titleRow);//获取第i行数据
data.add(map);
}
return data;
}
//获取excel中一行的数据
private Map<String,String> getRowData(HSSFRow row,HSSFRow titleRow){
Map<String,String> map = new HashMap<String,String>();
int firstCell = row.getFirstCellNum();//第一列序号
int lastCell = row.getLastCellNum();//最后一列序号
for(int j=firstCell;j<lastCell;j++){
String key = titleRow.getCell(j).getStringCellValue();//当前列标题
HSSFCell cell = row.getCell(j);//当前单元格
//当单元格是数字格式时,需要把它的cell type转成String,否则会出错
if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
String val =cell.getStringCellValue();//当前单元格的值
map.put(key,val);
}
return map;
}
}