由于Java项目中需要用到对导入的Excel表数据进行解析的功能,通过网上的一些资料和自己项目中的实际运用,对Excel解析的过程进行一下记录:
一、初始化
public List<List<List<String>>> parseExcel(MultipartFile file) {
if (file == null || "".equals(file.getOriginalFilename().trim())) {
return null;
} else {
try {
Workbook workbook = initWorkBook(file);
if (workbook != null) {
List<List<List<String>>> results = new ArrayList<>();
int numOfSheet = workbook.getNumberOfSheets();
// 解析sheet
for (int i = 0; i < numOfSheet; i++) {
Sheet sheet = workbook.getSheetAt(i);
List<List<String>> parseSheet = parseExcelSheet(sheet);
results.add(parseSheet);
}
return results;
}else {
return null;
}
}catch (IOException e) {
return null;
}
}
}
Workbook initWorkBook(MultipartFile file) throws IOException {
String postfix = getPostfix(file.getOriginalFilename());
if (!"".equals(postfix)) {
InputStream input = file.getInputStream();
Workbook workbook = null;
if ("xls".equals(postfix)) {
workbook = new HSSFWorkbook(input);
} else if ("xlsx".equals(postfix)) {
workbook = new XSSFWorkbook(input);
}
return workbook;
}else {
return null;
}
}
/**
* 获得path的后缀名
* @param path
* @return
*/
private String getPostfix(String path){
if(path==null || EMPTY.equals(path.trim())){
return "";
}
if(path.contains(".")){
return path.substring(path.lastIndexOf(".") + 1, path.length());
}
return "";
}
二、解析sheet
/**
* 解析每一个sheet数据
* */
private List<List<String>> parseExcelSheet(Sheet sheet) {
Row row;
int count = 0;
List<List<String>> results = new ArrayList<>();
int realRow = getExcelRealRow(sheet);
short cellNum = 0;
for (int i = 0; i < realRow; i++) {
row = sheet.getRow(i);
if (i == 0) {
cellNum = row.getLastCellNum();
}else {
System.out.println("行数:"+ cellNum);
List<String> parseRow = parseExcelRow(row, cellNum);
results.add(parseRow);
}
}
return results;
}
需要注意的是,为了避免出现空的数据导致行数被识别多的情况,我们必须判断一下真实的行数:
// 获取Excel表的真实行数
int getExcelRealRow(Sheet sheet) {
CellReference cellReference = new CellReference("A4");
boolean flag = false;
System.out.println("总行数:"+(sheet.getLastRowNum()+1));
for (int i = cellReference.getRow(); i <= sheet.getLastRowNum();) {
Row r = sheet.getRow(i);
if(r == null) {
// 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动
sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
continue;
}
flag = false;
for(Cell c:r) {
if(c.getCellType() != Cell.CELL_TYPE_BLANK){
flag = true;
break;
}
}
if(flag) {
i++;
continue;
}else {
// 如果是空白行(即可能没有数据,但是有一定格式)
if(i == sheet.getLastRowNum())// 如果到了最后一行,直接将那一行remove掉
sheet.removeRow(r);
else//如果还没到最后一行,则数据往上移一行
sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
}
}
System.out.println("总行数:"+(sheet.getLastRowNum()+1));
return sheet.getLastRowNum()+1;
}
三、解析row
/**
* 解析每一个row数据
* */
private List<String> parseExcelRow(Row row, int count) {
List<String> results = new ArrayList<>();
for (int i = 0; i < count; i++) {
Cell cell = row.getCell(i);
if (cell == null) {
results.add("");
}else {
// 定义每一个cell的数据类型
cell.setCellType(Cell.CELL_TYPE_STRING);
// 取出cell中的value
results.add(cell.getStringCellValue());
}
}
return results;
}
网友评论