导入Excel

该代码实现了一个功能,从Excel文件中读取数据,根据左四列内容进行分块,检查每行数据的非空性和长度限制,然后将符合要求的数据写入数据库。在写入前,会检查是否存在重复数据,确保数据的唯一性。如果遇到错误,返回相应的错误信息。此过程涉及文件流处理、Excel操作和数据库交互。
摘要由CSDN通过智能技术生成
/**
 * 导入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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值