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一般为中文
*/
private String name;
/**
* excel的列顺序从0开始可以name或者column二选一
*/
private Integer column;
/**
* 类型
*/

View File

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