在做NC65导入文件时,客户提供的excel文件可能会有两种情况,一种是固定字段所在列,一种是不确定字段所在列,也就是说列字段是随机的。
第一种情况我们可以直接按照顺序直接进行获取,在这里我是创建一个新的vo来存储excel表格数据
ArrayList<String> billnolist = new ArrayList<>();
HashMap<String, ArrayList<SaleImpExcelVO>> map = new HashMap<>();
for (int rowNum = 2; rowNum <= sheet.getLastRowNum(); rowNum++) {
Row row = sheet.getRow(rowNum);
//1、检查必输项
if(isEmpty(row,htlx)){
ExceptionUtils.wrappBusinessException("第"+rowNum+"行数据,excel中必输项存在空值,请检查!");
}
String key = getValue(row.getCell(2)); // 合同号
if(billnolist.contains(key)){
ArrayList<SaleImpExcelVO> excelvo_list = map.get(key);
SaleImpExcelVO excelvo = getExcelVO(row);
excelvo_list.add(excelvo);
map.put(key, excelvo_list);
}else{
ArrayList<SaleImpExcelVO> excelvo_list = new ArrayList<>();
SaleImpExcelVO excelvo = getExcelVO(row);
excelvo_list.add(excelvo);
map.put(key, excelvo_list);
billnolist.add(key);
}
}
private SaleImpExcelVO getExcelVO(Row row) {
SaleImpExcelVO vo = new SaleImpExcelVO();
int i=0;
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
vo.set表字段(getValue(row.getCell(i++)));
return vo;
}
在这里for循环每执行一次,row会被从新赋值,并且会从新走一遍getExcelVO方法,这样就可以按顺序获取excel表字段。
在excel表列字段顺序不固定的时候,可以根据首行的列名进行判断,来获取对应列的数据。
for(int i=0; i < cellCount; i++){//列
Cell cell = rows.getCell(i);
String filename=cell.getStringCellValue();
if("到账日期".equals(filename)){
vo.setDzdate(getValue(row.getCell(i)));
}
if("到账金额".equals(filename)){
vo.setDzmoney(getValue(row.getCell(i)));
}
if("汇入途径".equals(filename)){
vo.setZjxz(getValue(row.getCell(i)));
}
if("收款账号".equals(filename)){
vo.setSkaccount(getValue(row.getCell(i)));
}
if("付款户名".equals(filename)){
vo.setFkname(getValue(row.getCell(i)));
}
if("单位名称".equals(filename)){
vo.setDwname(getValue(row.getCell(i)));
}
if("进账编号".equals(filename)){
vo.setZdcode(getValue(row.getCell(i)));
}
}
return vo;
}
以上两种方法只针对首行为字段名,其他行为数据的情况,在遇到字段名不只在首行的情况时可以用,下面是获取excel表中第三列第七行的数据。
Row row = sheet.getRow(2); // 第三行
Cell cell = row.getCell(6); // 第七列
// 获取单元格的值
String cellValue = cell.getStringCellValue();
需要注意的是java在读取excel表格的时候是从第0行开始的。如果excel存在时间数据,因为在获取的时候是String类型,所以需要转为对应的日期的类型,在这里我将日期的类型转为date。
String dateString = excelvo.getDzdate();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse(dateString);
UFDateTime dateTime = new UFDateTime(date);