feat: 识别excel data 类型

This commit is contained in:
taojinlong 2021-06-01 14:05:45 +08:00
parent 331fda059a
commit c699ebeed4
2 changed files with 47 additions and 50 deletions

View File

@ -26,6 +26,7 @@ import io.dataease.provider.QueryProvider;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@ -45,6 +46,7 @@ import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -583,7 +585,7 @@ public class DataSetTableService {
switch (field) { switch (field) {
case "TEXT": case "TEXT":
return 0; return 0;
case "TIME": case "DATETIME":
return 1; return 1;
case "LONG": case "LONG":
case "INT": case "INT":
@ -701,16 +703,17 @@ public class DataSetTableService {
TableFiled tableFiled = new TableFiled(); TableFiled tableFiled = new TableFiled();
tableFiled.setFieldType("TEXT"); tableFiled.setFieldType("TEXT");
tableFiled.setFieldSize(1024); tableFiled.setFieldSize(1024);
String columnName = readCell(row.getCell(j)); String columnName = readCell(row.getCell(j), false, null);
if (StringUtils.isEmpty(columnName)) { if (StringUtils.isEmpty(columnName)) {
columnName = "NONE_" + String.valueOf(j); columnName = "NONE_" + String.valueOf(j);
} }
tableFiled.setFieldName(columnName); tableFiled.setFieldName(columnName);
tableFiled.setRemarks(columnName); tableFiled.setRemarks(columnName);
fields.add(tableFiled); fields.add(tableFiled);
} else { } else if (i == 1){
r[j] = readCell(row.getCell(j)); r[j] = readCell(row.getCell(j), true, fields.get(j));
}else {
r[j] = readCell(row.getCell(j), false, null);
} }
} }
if (i > 0) { if (i > 0) {
@ -740,15 +743,17 @@ public class DataSetTableService {
TableFiled tableFiled = new TableFiled(); TableFiled tableFiled = new TableFiled();
tableFiled.setFieldType("TEXT"); tableFiled.setFieldType("TEXT");
tableFiled.setFieldSize(1024); tableFiled.setFieldSize(1024);
String columnName = readCell(row.getCell(j)); String columnName = readCell(row.getCell(j),false, null);
if (StringUtils.isEmpty(columnName)) { if (StringUtils.isEmpty(columnName)) {
columnName = "NONE_" + String.valueOf(j); columnName = "NONE_" + String.valueOf(j);
} }
tableFiled.setFieldName(columnName); tableFiled.setFieldName(columnName);
tableFiled.setRemarks(columnName); tableFiled.setRemarks(columnName);
fields.add(tableFiled); fields.add(tableFiled);
} else { } else if (i == 1){
r[j] = readCell(row.getCell(j)); r[j] = readCell(row.getCell(j), true, fields.get(j));
}else {
r[j] = readCell(row.getCell(j), false, null);
} }
} }
if (i > 0) { if (i > 0) {
@ -792,58 +797,44 @@ public class DataSetTableService {
inputStream.close(); inputStream.close();
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
inferFieldType(fields, data);
map.put("fields", fields); map.put("fields", fields);
map.put("data", jsonArray); map.put("data", jsonArray);
map.put("sheets", sheets); map.put("sheets", sheets);
return map; return map;
} }
private void inferFieldType(List<TableFiled> fields, List<String[]> data){ private String readCell(Cell cell, boolean cellType, TableFiled tableFiled) {
if(CollectionUtils.isEmpty(fields) || CollectionUtils.isEmpty(data)) {
return;
}
String[] firstLine = data.get(0);
for (int i=0; i< fields.size()&& i < firstLine.length; i++) {
TableFiled filed = fields.get(i);
try{
Integer.valueOf(firstLine[i]);
filed.setFieldType("INT");
continue;
}catch (Exception ignore ){
}
try{
Long.valueOf(firstLine[i]);
filed.setFieldType("LONG");
continue;
}catch (Exception ignore ){}
try{
Double.valueOf(firstLine[i]);
filed.setFieldType("DOUBLE");
continue;
}catch (Exception ignore ){}
}
}
private String readCell(Cell cell) {
CellType cellTypeEnum = cell.getCellTypeEnum(); CellType cellTypeEnum = cell.getCellTypeEnum();
if (cellTypeEnum.equals(CellType.STRING)) { if (cellTypeEnum.equals(CellType.STRING)) {
if(cellType){ tableFiled.setFieldType("TEXT"); }
return cell.getStringCellValue(); return cell.getStringCellValue();
} else if (cellTypeEnum.equals(CellType.NUMERIC)) { } else if (cellTypeEnum.equals(CellType.NUMERIC)) {
double d = cell.getNumericCellValue(); if(HSSFDateUtil.isCellDateFormatted(cell)){
try { if(cellType) { tableFiled.setFieldType("DATETIME"); }
Double value = new Double(d); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
double eps = 1e-10; try {
if(value - Math.floor(value) < eps){ return sdf.format(cell.getDateCellValue());
return value.longValue() + ""; }catch (Exception e){
}else { return "";
NumberFormat nf = NumberFormat.getInstance(); }
nf.setGroupingUsed(false); }else {
return nf.format(value); double d = cell.getNumericCellValue();
try {
Double value = new Double(d);
double eps = 1e-10;
if(value - Math.floor(value) < eps){
if(cellType) { tableFiled.setFieldType("LONG"); }
return value.longValue() + "";
}else {
if(cellType){ tableFiled.setFieldType("DOUBLE");}
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
return nf.format(value);
}
} catch (Exception e) {
BigDecimal b = new BigDecimal(d);
return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "";
} }
} catch (Exception e) {
BigDecimal b = new BigDecimal(d);
return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "";
} }
} else if (cellTypeEnum.equals(CellType.BOOLEAN)) { } else if (cellTypeEnum.equals(CellType.BOOLEAN)) {
return cell.getBooleanCellValue() ? "1" : "0"; return cell.getBooleanCellValue() ? "1" : "0";

View File

@ -155,6 +155,7 @@ public class ExtractDataService {
break; break;
} }
} }
Column_Fields = Column_Fields.substring(0, Column_Fields.length() - 2); Column_Fields = Column_Fields.substring(0, Column_Fields.length() - 2);
Column_Fields = "(" + Column_Fields + ")\n"; Column_Fields = "(" + Column_Fields + ")\n";
return Column_Fields; return Column_Fields;
@ -637,7 +638,12 @@ public class ExtractDataService {
for (int i = 0; i < datasetTableFields.size(); i++) { for (int i = 0; i < datasetTableFields.size(); i++) {
ExcelInputField field = new ExcelInputField(); ExcelInputField field = new ExcelInputField();
field.setName(datasetTableFields.get(i).getOriginName()); field.setName(datasetTableFields.get(i).getOriginName());
field.setType("String"); if(datasetTableFields.get(i).getDeExtractType() == 1){
field.setType("Date");
field.setFormat("yyyy-MM-dd HH:mm:ss");
}else {
field.setType("String");
}
fields[i] = field; fields[i] = field;
} }