feat: 修改dataSheet支持根据column或者title来解析excel

This commit is contained in:
lilong 2024-03-20 10:22:43 +08:00
parent 9af69dbf95
commit bc3bd83a57
2 changed files with 23 additions and 3 deletions

View File

@ -316,6 +316,12 @@ public interface DataSheetClient {
* cell的header一般为中文 * cell的header一般为中文
*/ */
private String name; private String name;
/**
* excel的列顺序从0开始可以name或者column二选一
*/
private Integer column;
/** /**
* 类型 * 类型
*/ */

View File

@ -25,6 +25,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@ -359,8 +360,9 @@ public class DataSheetImporter extends DataSheetClient.ImporterBuilder {
// 根据meta来校验cell的类型 // 根据meta来校验cell的类型
Map<Integer, String> headerMap = dataListener.getHeadMap(); Map<Integer, String> headerMap = dataListener.getHeadMap();
Map<String, DataSheetClient.CellMeta> cellMetaMap = Maps.uniqueIndex(meta.getCellMetas(), boolean cellTypeColumn = meta.getCellMetas().stream().anyMatch(cellMeta -> cellMeta.getColumn() == null);
DataSheetClient.CellMeta::getName); Map<String, DataSheetClient.CellMeta> cellMetaMap = resolveCellMetaMap(cellTypeColumn);
List<Map<Integer, String>> lines = dataListener.getLines(); List<Map<Integer, String>> lines = dataListener.getLines();
return IntStream.range(0, lines.size()) return IntStream.range(0, lines.size())
.mapToObj(lineIndex -> { .mapToObj(lineIndex -> {
@ -370,7 +372,7 @@ public class DataSheetImporter extends DataSheetClient.ImporterBuilder {
.map(entry -> { .map(entry -> {
Integer columnIndex = entry.getKey(); Integer columnIndex = entry.getKey();
String header = entry.getValue(); String header = entry.getValue();
DataSheetClient.CellMeta cellMeta = cellMetaMap.get(header); DataSheetClient.CellMeta cellMeta = cellTypeColumn ? cellMetaMap.get(columnIndex.toString()) : cellMetaMap.get(header);
return convertType(cellMeta, line.get(columnIndex), lineIndex, columnIndex); return convertType(cellMeta, line.get(columnIndex), lineIndex, columnIndex);
}) })
.collect(Collectors.groupingBy(ColumnConvertResp::getSuccess)); .collect(Collectors.groupingBy(ColumnConvertResp::getSuccess));
@ -391,6 +393,18 @@ public class DataSheetImporter extends DataSheetClient.ImporterBuilder {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private Map<String, DataSheetClient.CellMeta> resolveCellMetaMap(boolean cellTypeColumn) {
if (BooleanUtils.isTrue(cellTypeColumn)) {
// 根据列顺序解析
return Maps.uniqueIndex(meta.getCellMetas(),
cellMeta -> cellMeta.getColumn().toString());
}
// 根据列名字解析
return Maps.uniqueIndex(meta.getCellMetas(),
DataSheetClient.CellMeta::getName);
}
private ColumnConvertResp convertType(DataSheetClient.CellMeta cellMeta, String rawValue, int rowIndex, int columnIndex) { private ColumnConvertResp convertType(DataSheetClient.CellMeta cellMeta, String rawValue, int rowIndex, int columnIndex) {
try { try {
return ColumnConvertResp.builder() return ColumnConvertResp.builder()