背景:需求读取多个不同类型的Excel (xls/xlsx)且excel文件内容格式不一样的文件,读取到数据后对比每行数据给句规则取共同交集数据入库。我这里的数据确定只有第一个Sheet取数且每张Excel表的表头不确定,所以我这里使用一个List<Map<String ,String >> 接收数据。
如下Excel:
常规内容取数:
复杂格式内容取数:
这里取数有个问题就是找到表头行后像我框红的哪里合并的单元格他会赋给表头的每列(欢迎技术交流去掉这种行数据 ,因为我这里是多个Excel取交集所以不用考录过滤掉这种数据)
思路:
1.确定表头信息行: 这里是如果导入Excel第一行不是表头信息 从而确定那行是表头信息。表头正常情况是不会重复的,所以这里使用了冒泡排序确定该行单元格是否值相等,都不相等证明是表头行。
/**
* 冒泡排序比较单元格的值是否相等
*
* @param strings
* @return
*/
public static boolean isEqual(String[] strings) {
int length = strings.length;
for (int i = 0; i < length; i++) {
String temp = strings[i];
for (int j = i + 1; j < length; j++) {
String string = strings[j];
if (string.equals(temp)) {
log.info(temp);
return true;
}
}
}
return false;
}
}
2. 确定是否有合并单元格并取合并单元格值
/**
* 判断指定的单元格是否是合并单元格
*
* @param sheet
* @param row 行下标
* @param column 列下标
* @return
*/
public static boolean isMergedRegion(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
}
/**
* 获取合并单元格的值
*
* @param sheet
*