需求
如图所示
在T列中有合并单元格和非合并单元格,由于需要将合并单元格的数据也插入到数据库中,需要达到的效果如下
原来是
现在需要变成
需要我们将合并的单元格进行拆分,然后再相对应的赋值上去
思路
- 读取excel的每行数据
- 如果碰到合并单元格就判断 如果是一个单元格 除了第一行有数据其他为空 那这个就是我们要处理的数据
代码实现
本需求是在SpringBoot 2.5下完成的实现
先提供两个方法,一个是判断合并单元格,拆分的格子是否是null,另一个是拆分了单元格之后,除了第一行有数据,其他行是否为null
/**
* 判断是否为合并单元格,且拆开该合并后除队一行有数据其他为null
* @param sheet 工作表
* @param rowIndex 索引行
* @param columnIndex 索引列
* @return 满足条件返回true
*/
public static boolean isMergedEmptyCell(Sheet sheet, int rowIndex, int columnIndex) {
int numMergedRegions = sheet.getNumMergedRegions();
for (int i = 0; i < numMergedRegions; i++) {
CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
if (mergedRegion != null && mergedRegion.isInRange(rowIndex - 1, columnIndex)) {
Row firstRow = sheet.getRow(mergedRegion.getFirstRow());
if (firstRow != null && isCellEmpty(firstRow.getCell(mergedRegion.getFirstColumn()))) {
for (int r = mergedRegion.getFirstRow() + 1; r <= mergedRegion.getLastRow(); r++) {
Row mergedRow = sheet.getRow(r);
if (mergedRow != null && isCellEmpty(mergedRow.getCell(mergedRegion.getFirstColumn()))) {
return false;
}
}
return true;
}
}
}
return false;
}
/**
* 判断单元格是否为null
* @param cell 单元格
* @return true为null
*/
public static boolean isCellEmpty(Cell cell) {
if (cell == null || cell.getCellType() == CellType.BLANK) {
return false;
} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().trim().isEmpty()) {
return false;
}
return true;
}
写一个导入方法
/**
* 注意:以下用字段就是指列的值
*
*
*/
private static List<Template> readTemplateSheet2(Sheet sheet) {
Map<Integer, String> cache = new HashMap<>();
int lineNumber = 1;
String stype = "";
String priority = "";
String comment = "";
String type = sheet.getSheetName().trim();
int currentRow = 0;// 当前行
try {
Kv kv = new Kv();
List<Template> recordList = new ArrayList<>();
int count = 0;
for (Row row : sheet) {
currentRow++;
try {
count++;
if (count < 3) {
for (int i = 0; i < row.getLastCellNum(); i++) {
Cell cell = row.getCell(i);
String label = cell == null ? null : getCellStringValue(cell);
if (!StringUtils.isEmpty(label)) {
kv.set(row.getCell(i).toString().trim(), i);
}
}
continue;
}
if (!kv.containsKey("命名规范示例") && !kv.containsKey("规范信息")) {
return Collections.emptyList();
}
String signal;
String signalkey = "命名规范示例";
if (kv.containsKey("规范信息")) {
signalkey = "规范信息";
}
signal = getCellValue(sheet, row, kv.getInt(signalkey));
if (StringUtils.isEmpty(signal)) {
continue;
}
Template template = new Template();
template.setContent(signal);
template.setVoltage(extractString(type));
template.setDevType2(type);
template.setStype(getCellValue(sheet, row, kv.getInt("字段1")));
template.setIsReal(cellToInteger(getCellValue(sheet, row, kv.getInt("字段2"))));
template.setIsFault(cellToInteger(getCellValue(sheet, row, kv.getInt("字段3"))));
template.setIsException(cellToInteger(getCellValue(sheet, row, kv.getInt("字段4"))));
template.setIsNotify(cellToInteger(getCellValue(sheet, row, kv.getInt("字段5"))));
template.setIsBoard(cellToInteger(getCellValue(sheet, row, kv.getInt("字段6"))));
template.setIsVoice(cellToInteger(getCellValue(sheet, row, kv.getInt("字段7"))));
template.setStatus(cellToInteger(getCellValue(sheet, row, kv.getInt("字段8"))));
template.setIsNecessary(cellToInteger(getCellValue(sheet, row, kv.getInt("字段9"))));
template.setIsMerge(cellToInteger(getCellValue(sheet, row, kv.getInt("字段10"))));
template.setMatchThreshold(getCellDoubleValue(row, kv.getInt("字段11")));
// 报错情况 priority读到null 会读到double类型 会读到“—” priority = String.valueOf(getCellValue(sheet, row, kv.getInt("字段12")));
if (priority.contains("—")) {
Template template1 = recordList.get(currentRow - 4);
priority = String.valueOf(template1.getPriority());
} else if (priority.isEmpty()) {
priority = cache.getOrDefault(lineNumber, "0");
} else {
priority = priority.replace(".0", "");
cache.put(lineNumber, priority);
}
template.setPriority(Integer.parseInt(priority));
// template.setPriority(Integer.valueOf(getCellValue(sheet, row, kv.getInt("字段13"))));// template.setComment(getCellValue(sheet, row, kv.getInt("字段14"))); // 处理字段列 comment = getCellValue(sheet, row, kv.getInt("字段14"));
if (!"".equals(comment)){
cache.put(lineNumber + 1,comment);
}
if (isMergedEmptyCell(sheet,count,kv.getInt("备注"))){
comment = cache.get(lineNumber + 1);
template.setComment(comment);
} else {
template.setComment(comment);
}
stype = template.getStype();
if (stype.isEmpty()) {
// 说明该列读到了null或空字符串 stype = cache.getOrDefault(lineNumber + 2, "");
} else {
cache.put(lineNumber + 2, stype);
}
template.setStype(stype);
recordList.add(template);
} catch (Exception e) {
e.printStackTrace();
}
}
return recordList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
最后写一个api接口测试看看
@PostMapping("/import/data/new")
@ApiOperation("导入规范库列表 新2023-7-4")
@ApiOperationSupport(order = 13)
public R importDataNew(@RequestParam("file") MultipartFile file) {
signalTemplateService.importDataNew(file);
return R.success();
}
搞定
本篇文章如有疑问欢迎评论讨论,作者会在第一时间看到问题之后回复,很少发帖,如有不足或错误之处,希望大家多多海涵,感谢!