/**
* 导入excel
* 1.获取Excel文件,创建workbook工作空间进行操作表格
* 2.根据左边四列进行分块
* 只要不同时为空那就是块开始,同时为空就是快内一行
* 到了下一次不同时为空,就是上一块的结束
* 只有一行的情况和尾行需要进行特殊处理
* 将分好的块写入数组,数组每个元素表示块有多少行表格
* 3.写入
* 便利整个表格,在根据数组元素进行便利
* 块首行进行特殊处理,其余块内行 根据左四列 获取 新生成的主表id,依次写入数据库
* 在写入数据库之前对每一个单元格进行判断,不符合条件直接返回 5000+不符合的原因(暂时只判断了非空与长度)
* @param file 文件
* @param userNo 操作人
* @return
*/
@Override
@Transactional
public Response importExcel(MultipartFile file, String userNo) {
/**
* 1.获取文件名(getOriginalFilename()) 根据文件类型判断是生成那种workBook空间
* xls:HSSFWorkbook空间
* xlsx:XSSFWorkbook空间
* tableErrorData:用来记录每一行表格的错误信息
* mapDict://用来存储SYS_DICT表数据并进行写入
* mapDictItem://用来存储SYS_DICT_ITEM数据并进行写入
* file.getOriginalFilename():获取文件名字
* tableErrorData:文件内容有错误返回的字符串
*/
Map<String, Object> mapDict = null;
Map<String, Object> mapDictItem = null;
String fileName = file.getOriginalFilename();
String tableErrorData = "";
try {
/**
* getInputStream:根据传过来的文件获取这个文件的输入流
* filePath:记录表格文件错误的原因
* FileWriter:创建文件流 用来记录文件表格错误数据
* fwriter1:第一次记录的时候创建新的流文件
* fwriter2:第二次的时候直接写到后面
* true表示不覆盖原来的内容,而是加到文件的后面。若要覆盖原来的内容,直接省略这个参数就好
* fwriterBoolFile:记录是否对流进行写入过内容 false没写过 true 写过
* Workbook:excel工作空间
* new XSSFWorkbook(inputStream):后缀为xlsx的excel2007
* new HSSFWorkbook(inputStream):后缀为xls的excel2003
*/
InputStream inputStream = file.getInputStream();
Workbook workbook = null;
if (fileName.endsWith(".xlsx"))
workbook = new XSSFWorkbook(inputStream);
if (fileName.endsWith(".xls"))
workbook = new HSSFWorkbook(inputStream);
/**
* getSheetAt:获取表格页
* getLastRowNum:总行 获取的是行最大下标
* 根据行判断是否空文件 因为特殊标题头右两行
* getRow(2).getLastCellNum():第几行的有多少列
*/
Sheet sheet = workbook.getSheetAt(0);
int allRow = sheet.getLastRowNum();
System.out.println("allrow::::::::::" + allRow);
// if (allRow < 0) {
// return Response.failure(“500”, “文件是空文件!!!”, null);
// } else if (allRow > 0 && allRow < 2) {
// return Response.failure(“500”, “文件内容为空!!!”, null);
// } else {
// }
/**
* 标题行判断暂时跳过
/
/*
* 表格内容判断并写入
* 先拿所有主表块
* 对每一行都进行判断
* 一个数组tableBlock:作用 用来根据主表来存储表格块的,存储每一块表格有多少行
* 数组下表:arraySubscript:数组tableBlock下标
* 声明一个变量tableBlockSize:这一块表格有多少行 空行也算
* 只要前三列同时为空并且后四列也不同时为空 变量++
* 左三同时等于null说明在块里 tableBlockSize++
* 左三不同时为null说明是一个新的表格块开始 tableBlockSize写入数组 初始化0 在++
/
int[] tableBlock = new int[allRow];
int arraySubscript = 0;
int tableBlockSize = 0;
/*
* 分块
* 空行直接跳过
* 表格行内的第一行 左边三列一定不会同时为空
* dictRows:表格内容开始的下标
* isRowEmpty(row):
/
int dictRows = 2;//测试表格下标
for (int i = 1; i < allRow; i++) {
Row row = sheet.getRow(dictRows);//获取表格行
// boolean isRmptyRow = isRowEmpty(row);//调用判断空白行的方法
// if (isRmptyRow) {//返回结果为true表示空白行 结束本次循环
// continue;//空行跳过
// }
String str0 = String.valueOf(row.getCell(0));
String str1 = String.valueOf(row.getCell(1));
String str2 = String.valueOf(row.getCell(2));
String str3 = String.valueOf(row.getCell(3));
if (str0.equals(“null”) && str1.equals(“null”) && str2.equals(“null”) && str3.equals(“null”)) {
tableBlockSize++;
if (dictRows == allRow) {//到表格最后一行了
System.out.println(“数组第::::::::::” + arraySubscript + “次写入”);
tableBlock[arraySubscript] = tableBlockSize;
arraySubscript++;
tableBlockSize = 0;
i = allRow;
}
} else {
/*
* 不管数据行第一行是不是空行
* arraySubscript:写入一次数组 就++ 表示数组下标
* tableBlockSize写入数组 并初始化 在++
左三不同时为空说明是块开始的地方
/
if (dictRows == 2) {
/
* 数据行第一行
/
tableBlockSize++;
if (dictRows == allRow) {
System.out.println(“数组第::::::::::” + arraySubscript + “次写入”);
tableBlock[arraySubscript] = tableBlockSize;
arraySubscript++;
tableBlockSize = 0;
}
} else {
System.out.println(“数组第::::::::::” + arraySubscript + “次写入”);
tableBlock[arraySubscript] = tableBlockSize;
arraySubscript++;
tableBlockSize = 0;
tableBlockSize++;
}
}
dictRows++;
}
/*
* 根据快来进行写入
* dictROw:记录表格行下表
* 便利表格
* 在根据快来进行计算并写入数据库
/
System.out.println(“数组内容:::::::::” + Arrays.toString(tableBlock));
dictRows = 2;//记录行下表
int dictId = 0;
for (int i = 0; i < allRow; i++) {
mapDict = new HashMap<>();
mapDictItem = new HashMap<>();
for (int j = 0; j < tableBlock[i]; j++) {
Row row = sheet.getRow(dictRows);//获取表格行
if (j == 0) {
if (String.valueOf(row.getCell(0)).equals(“null”)) {
return Response.success(“5000”, “第” + (dictRows+1) + “行第1列单元格为空”, null);
} else {
if (String.valueOf(row.getCell(0)).length() > 100) {
return Response.success(“5000”, “第” + (dictRows+1)+ “行第1列单元格内容长度不能超过100”, null);
} else {
mapDict.put(“dictName”, String.valueOf(row.getCell(0)));
}
}
if (String.valueOf(row.getCell(1)).equals(“null”)) {
return Response.success(“5000”, “第” + (dictRows+1)+ “行第2列单元格为空”, null);
} else {
if (String.valueOf(row.getCell(1)).length() > 100) {
return Response.success(“5000”, “第” + (dictRows+1) + “行第2列单元格内容长度不能超过100”, null);
} else {
mapDict.put(“dictCode”, String.valueOf(row.getCell(1)));
}
}
if (String.valueOf(row.getCell(2)).equals(“null”)) {
return Response.success(“5000”, “第” + (dictRows+1) + “行第3列单元格为空”, null);
} else {
if (String.valueOf(row.getCell(2)).length() > 255) {
return Response.success(“5000”, “第” + (dictRows+1) + “行第3列单元格内容长度不能超过255”, null);
} else {
mapDict.put(“description”, String.valueOf(row.getCell(2)));
}
}
if (String.valueOf(row.getCell(3)).equals(“null”)) {
return Response.success(“5000”, “第” + (dictRows+1) + “行第4列单元格为空”, null);
} else {
if (String.valueOf(row.getCell(3)).length() > 50) {
return Response.success(“5000”, “第” + (dictRows+1)+ “行第4列单元格内容长度不能超过50”, null);
} else {
mapDict.put(“system”, String.valueOf(row.getCell(3)));
}
}
/*
* 查重
* repeatDict.size()==0 说明没有重复 进行新增
*/
List<Map<String, Object>> repeatDict = mapper.searchRepeatDict(mapDict);
if (repeatDict.size() == 0) {
mapDict.put(“userNo”, userNo);
mapper.add(mapDict);
dictId = mapper.selectDictId(mapDict);
} else {
return Response.success(“5000”, “第” + (dictRows + 1) + “行前四列数据重复”, null, null);
}
if (String.valueOf(row.getCell(4)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第5列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(4)).length() > 100) {
return Response.success("5000", "第" + (dictRows + 1) + "行第5列单元格内容长度不能超过100", null, null);
} else {
mapDictItem.put("itemValue", String.valueOf(row.getCell(4)));
}
}
if (String.valueOf(row.getCell(5)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第6列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(5)).length() > 100) {
return Response.success("5000", "第" + (dictRows+1)+ "行第6列单元格内容长度不能超过100", null, null);
} else {
mapDictItem.put("itemNclob", String.valueOf(row.getCell(5)));
}
}
if (String.valueOf(row.getCell(6)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第7列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(6)).length() > 255) {
return Response.success("5000", "第" + (dictRows+1)+ "行第7列单元格内容长度不能超过255", null, null);
} else {
mapDictItem.put("description", String.valueOf(row.getCell(6)));
}
}
if (String.valueOf(row.getCell(7)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第8列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(7)).length() > 50) {
return Response.success("5000", "第" + (dictRows+1) + "行第8列单元格内容长度不能超过50", null, null);
} else {
if (isNumeric(String.valueOf(row.getCell(7)))) {
mapDictItem.put("sortOrder", String.valueOf(row.getCell(7)));
} else {
return Response.success("5000", "第8列排序列必须为数字!!!", null, null);
}
}
}
mapDictItem.put("dictID", dictId);
List<Map<String, Object>> repeatDictItem = mapper.searchDictItemId(mapDictItem);
if (repeatDictItem.size() == 0) {
mapDictItem.put("userNo", userNo);
mapper.addItem(mapDictItem);
System.out.println("IMPL:::::SYS_DICT_ITEM::::" + dictRows);
} else {
return Response.success("5000", "第" + (dictRows + 1) + "行后四列数据重复", null, null);
}
} else {
if (String.valueOf(row.getCell(4)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第5列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(4)).length() > 100) {
return Response.success("5000", "第" + (dictRows + 1) + "行第5列单元格内容长度不能超过100", null, null);
} else {
mapDictItem.put("itemValue", String.valueOf(row.getCell(4)));
}
}
if (String.valueOf(row.getCell(5)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第6列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(5)).length() > 100) {
return Response.success("5000", "第" + (dictRows+1) + "行第6列单元格内容长度不能超过100", null, null);
} else {
mapDictItem.put("itemNclob", String.valueOf(row.getCell(5)));
}
}
if (String.valueOf(row.getCell(6)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第7列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(6)).length() > 255) {
return Response.success("5000", "第" + (dictRows+1) + "行第7列单元格内容长度不能超过255", null, null);
} else {
mapDictItem.put("description", String.valueOf(row.getCell(6)));
}
}
if (String.valueOf(row.getCell(7)).equals("null")) {
return Response.success("5000", "第" + (dictRows + 1) + "行第8列单元格为空", null, null);
} else {
if (String.valueOf(row.getCell(7)).length() > 50) {
return Response.success("5000", "第" + (dictRows+1)+ "行第8列单元格内容长度不能超过50", null, null);
} else {
if (isNumeric(String.valueOf(row.getCell(7)))) {
mapDictItem.put("sortOrder", String.valueOf(row.getCell(7)));
} else {
return Response.success("5000","第8列排序列必须为数字!!!", null, null);
}
}
}
mapDictItem.put("dictID", dictId);
List<Map<String, Object>> repeatDictItem = mapper.searchDictItemId(mapDictItem);
if (repeatDictItem.size() == 0) {
mapDictItem.put("userNo", userNo);
mapper.addItem(mapDictItem);
} else {
return Response.success("5000", "第" + (dictRows + 1) + "行后四列数据重复", null, null);
}
}
dictRows++;
}
}
return Response.success();
} catch (Exception e) {
e.printStackTrace();
return Response.failure("5000", "文件流异常!!!", null);
}
}