这是我所要解析的文件,我只取其中快递单号、省份、应到日期的数据。其他我都忽略不取,需求要求的。
String fullFileName = "/Users/mac/Desktop/zto/expressExcel.xlsx";
InputStream is = new FileInputStream(fullFileName);//先根据路径获取到文件,我的是Mac的路径
int date = -1;//日期
int num = -1;//运单
int pro = -1;//省份
XSSFWorkbook wb = new XSSFWorkbook(bis);//创建工作簿
ArrayList<ExpressExcelVO> expressExcelVOArrayList = new ArrayList<>();//记录每一行cell所生成的数据
for (Sheet sheet:wb) {//开始遍历每一页
if (sheet.getLastRowNum() > 0){//判断空
XSSFRow row = (XSSFRow) sheet.getRow(0);//先获取第一行物流文字排列格式,记录索引
int index = 0;//记录当前遍历的位置
for (Cell cell: row) {//开始遍历这一页的每个数据
switch (cell.toString()){//如果相同就把当前位置的索引赋值给他
case "快递单号":
num = index;
break;
case "应到日期":
date = index;
break;
case "省份":
pro = index;
break;
}
++index;
}
//判断有没有这几个数据,-1就是没有
if (num == -1 && date == -1 && pro== -1){
continue;
}else{
getExcelCell(date, num, pro,expressExcelVOArrayList, sheet);//根据3个索引解析出每一行的数据,从第二行开始
}
}
//调用方法
private static void getExcelCell(int date, int num, int pro, ArrayList<ExpressExcelVO> expressExcelVOArrayList, Sheet sheet) {
int rowNo = sheet.getLastRowNum();//总共的行数
count += rowNo;
//开始循环标题下的数据
for (int i = 1; i <= rowNo; i++) {
ExpressExcelVO expressExcelVO = new ExpressExcelVO();
XSSFRow sheetRow = (XSSFRow) sheet.getRow(i);
//运单号
XSSFCell expressNum = sheetRow.getCell(num);
if (null != expressNum){
expressExcelVO.setExpressNumber(expressNum.toString());//放入运单号
}
//省份
XSSFCell province= sheetRow.getCell(pro);
if (null != province){
expressExcelVO.setProvince(province.toString());//放入省市
}
//应到时间
XSSFCell arrDate = sheetRow.getCell(date);
if (null != arrDate){
Date dateCellValue = arrDate.getDateCellValue();
//时间+1
Calendar calendar = new GregorianCalendar();
calendar.setTime(dateCellValue);
calendar.add(Calendar.DATE,1);
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date time = calendar.getTime();
expressExcelVO.setArriveDate(new Timestamp(time.getTime()));//放入应到时间
String format = formater.format(time);
System.out.println(format);
expressExcelVOArrayList.add(expressExcelVO);
}
}