首先接受前台传过来的FileInputStream属性的文件,
Workbook readwb = Workbook.getWorkbook(fileBuffer);
接着获取第一张表的信息:Sheet readsheet = readwb.getSheet(0);
用一个int变量将表中的总行数给接受:int rsRows = readsheet.getRows();
Range[] rangeCell = readsheet.getMergedCells();// 获取合并单元格 × 不需要不写即可
接着循环这个表中的总行数,判断内容是否为空,不为空就将内容存进对象中 int i =2 是根据表格第几行开始有数据
getCell(1,i)是获取表格的第一列第几行 getContents()是获取表格具体的内容的 trim()是去除两端多余的空格的:
for (int i = 2; i < rsRows; i++) // 获取指定单元格的对象引用
{
CoreTargetCustomer coreTargetCustomer = new CoreTargetCustomer();
if (!"".equals(readsheet.getCell(1, i).getContents().toString().trim()))
coreTargetCustomer.setOrganFullName(readsheet.getCell(1, i).getContents().toString());// 读取单元格数据
if (!"".equals(readsheet.getCell(2, i).getContents().toString().trim()))
coreTargetCustomer.setCompanyName(readsheet.getCell(2, i).getContents().toString());
if (!"".equals(readsheet.getCell(3, i).getContents().toString().trim()))
coreTargetCustomer.setMaintainPeople(readsheet.getCell(3, i).getContents().toString());
if (!FormatUtil.allFieldIsNULL(coreTargetCustomer)) {// 判断读取到的元素是否都为空
coreTargetCustomer.setCreateTime(timestamp);//设置时间的格式的 × 不需要不写即可
coreTargetCustomer.setYear(year);// 前台传入自定义导入时间ID ×
coreTargetCustomer.setMonth(month);// 前台传入自定义导入时间ID ×
coreTargetCustomer.setIsDelete(false); //改变数据库中的状态 ×
ecros.add(coreTargetCustomer); ecros是自己定义的一个list集合
} else {
break;// 遇到空行,跳出读表;
}
}
readwb.close(); //关闭资源
// 日期格式进行转换
DateCell dc;
Date date;
if (!"".equals(readsheet.getCell(4, i).getContents().toString().trim()))
{
dc = (DateCell) readsheet.getCell(4, i);
date = dc.getDate();
String str = SF_date.format(date);// 日期部分
String str2 = SF_time.format(date);// 时间部分
String dateStr = str + " " + str2;
depositDetail.setCloseTime(Timestamp.valueOf(dateStr));
}
//人民币格式进行转换 在表格中的显示是40,101,504.22 replace()将,表换为空格
if (!"".equals(readsheet.getCell(7, i).getContents().toString().trim()))// 人民币余额须格式转换
depositDetail.setCnyBalance(
new BigDecimal(readsheet.getCell(7, i).getContents().toString().replace(",", ""))
.setScale(2, BigDecimal.ROUND_DOWN));
//判断一个对象里面的元素是否都为null
public static boolean allFieldIsNULL(Object obj) {
Boolean flag = true;//都为空
if (null == obj || "".equals(obj)) return flag;
try {
for (Field field : obj.getClass().getDeclaredFields()) { //TODO 循环该类,取出类中的每个属性
field.setAccessible(true);//TODO 把该类中的所有属性设置成 public
Object object = field.get(obj); //TODO object 是对象中的属性
if (object instanceof CharSequence) { //TODO 判断对象中的属性的类型,是否都是CharSequence的子类
if (!ObjectIsNullUtil.isNull(object)) { //TODO 如果是他的子类,那么就可以用ObjectUtils.isEmpty进行比较
flag = false;//不为空
}
} else { //TODO 如果不是那就直接用null判断
if (!(null == object || "".equals(object))) {
flag = false;//不为空
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;//false:不都为空
}
在导入手机号或者身份证 时间的时候 存在数据后面是不正确的格式
Cell cell = row.getCell(5);
String strCell = "";
switch (cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC: //数字
DataFormatter dataFormatter = new DataFormatter();
strCell = dataFormatter.formatCellValue(cell);
//这行代码就可以完美解决数字的小数点显示问题及电话号等长数字的科学计数法显示问题
//注意不要使用HSSFDataFormatter方法,这只支持2003版的excel哦
break;
case Cell.CELL_TYPE_STRING: //字符串
strCell = String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN: //Boolean
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA: //公式
strCell = String.valueOf(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK: //空值
strCell = "";
break;
case Cell.CELL_TYPE_ERROR: //故障
strCell = "非法字符";
break;
default:
strCell = "未知类型";
break;
}