1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

Clean up ExcelImportProecess

This commit is contained in:
dengchao@xgtl 2020-04-16 15:02:13 +08:00
parent c45941540c
commit f6a09e8c48

View File

@ -26,14 +26,9 @@ import com.google.common.collect.ArrayListMultimap;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
@ -43,10 +38,7 @@ import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class ExcelImportProecess extends DataProcess {
@ -85,10 +77,12 @@ public class ExcelImportProecess extends DataProcess {
Workbook wb = null;
try {
Objects.requireNonNull(is);
wb = isExcel2003 ? new HSSFWorkbook(is) : new XSSFWorkbook(is);
} catch (IOException ex) {
ex.printStackTrace();
}
Objects.requireNonNull(wb);
Sheet sheet = wb.getSheetAt(0);
Row titleRow = sheet.getRow(0);
Row valueRow = sheet.getRow(1);
@ -100,11 +94,11 @@ public class ExcelImportProecess extends DataProcess {
break;
}
}
/**
/*
* 需要检查Mapping 是否存在
*/
long start = System.currentTimeMillis();
Map<Object, List> refValues = new HashMap<Object, List>();
Map<Object, List> refValues = new HashMap<>();
MetadataTable table = event.getDSData().getTask();
for (TableProperties tp : table.getTableproperty()) {
if (tp.isReffk() && !StringUtils.isBlank(tp.getReftbid())) {
@ -123,7 +117,7 @@ public class ExcelImportProecess extends DataProcess {
Map<String, Object> values = new HashMap<>();
ArrayListMultimap<String, Object> multiValues = ArrayListMultimap.create();
boolean skipDataVal = false; //跳过数据校验
StringBuffer pkStr = new StringBuffer(), allStr = new StringBuffer();
StringBuilder pkStr = new StringBuilder(), allStr = new StringBuilder();
for (int col = 0; col < colNum; col++) {
Cell value = row.getCell(col);
Cell title = titleRow.getCell(col);
@ -155,7 +149,7 @@ public class ExcelImportProecess extends DataProcess {
} else if (tableProperties.isReffk() && refValues.get(tableProperties.getFieldname()) != null) {
List keys = refValues.get(tableProperties.getFieldname());
if (keys != null) {
values.put(tableProperties.getFieldname(), getRefid(tableProperties, refValues.get(tableProperties.getFieldname()), valuestr));
values.put(tableProperties.getFieldname(), getRefid(refValues.get(tableProperties.getFieldname()), valuestr));
}
} else {
values.put(tableProperties.getFieldname(), valuestr);
@ -186,27 +180,27 @@ public class ExcelImportProecess extends DataProcess {
for (TableProperties tp : table.getTableproperty()) {
if (!StringUtils.isBlank(tp.getDefaultvaluetitle())) {
String valuestr = (String) values.get(tp.getFieldname());
if (tp.getDefaultvaluetitle().indexOf("required") >= 0 && StringUtils.isBlank(valuestr)) {
if (tp.getDefaultvaluetitle().contains("required") && StringUtils.isBlank(valuestr)) {
skipDataVal = true;
validFaildMessage = "required";
break;
} else if (valuestr != null && (tp.getDefaultvaluetitle().indexOf("numstr") >= 0 && !valuestr.matches("[\\d]{1,}"))) {
} else if (valuestr != null && (tp.getDefaultvaluetitle().contains("numstr") && !valuestr.matches("[\\d]+"))) {
skipDataVal = true;
validFaildMessage = "numstr";
break;
} else if (valuestr != null && (tp.getDefaultvaluetitle().indexOf("datenum") >= 0 || tp.getDefaultvaluetitle().indexOf("datetime") >= 0)) {
if (!valuestr.matches("[\\d]{4,4}-[\\d]{2,2}-[\\d]{2,2}") && !valuestr.matches("[\\d]{4,4}-[\\d]{2,2}-[\\d]{2} [\\d]{2,2}:[\\d]{2,2}:[\\d]{2,2}")) {
} else if (valuestr != null && (tp.getDefaultvaluetitle().contains("datenum") || tp.getDefaultvaluetitle().contains("datetime"))) {
if (!valuestr.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}") && !valuestr.matches("[\\d]{4}-[\\d]{2}-[\\d]{2} [\\d]{2}:[\\d]{2}:[\\d]{2}")) {
skipDataVal = true;
validFaildMessage = "datenum";
break;
} else {
if (valuestr.matches("[\\d]{4,4}-[\\d]{2,2}-{1,1}")) {
if (valuestr.matches("[\\d]{4}-[\\d]{2}-")) {
if ("date".equals(tp.getDefaultfieldvalue())) {
values.put(tp.getFieldname(), MainUtils.simpleDateFormat.parse(valuestr));
} else {
values.put(tp.getFieldname(), MainUtils.simpleDateFormat.format(MainUtils.simpleDateFormat.parse(valuestr)));
}
} else if (valuestr.matches("[\\d]{4,4}-[\\d]{2,2}-[\\d]{2,2} [\\d]{2,2}:[\\d]{2,2}:[\\d]{2,2}")) {
} else if (valuestr.matches("[\\d]{4}-[\\d]{2}-[\\d]{2} [\\d]{2}:[\\d]{2}:[\\d]{2}")) {
if ("date".equals(tp.getDefaultfieldvalue())) {
values.put(tp.getFieldname(), MainUtils.dateFormate.parse(valuestr));
} else {
@ -228,15 +222,15 @@ public class ExcelImportProecess extends DataProcess {
}
event.getDSData().getReport().setTotal(pages.intValue());
values.put("creater", event.getValues().get("creater"));
if (data != null && skipDataVal == false) {
if (data != null && !skipDataVal) {
MainUtils.populate(data, values);
pages.incrementAndGet();
event.getDSData().getProcess().process(data);
} else if (data == null) {
/**
/*
* 导入的数据只写入ES
*/
if (skipDataVal == true) { //跳过
if (skipDataVal) { //跳过
values.put("status", "invalid");
values.put("validresult", "invalid");
values.put("validmessage", validFaildMessage != null ? validFaildMessage : "");
@ -255,21 +249,17 @@ public class ExcelImportProecess extends DataProcess {
}
if (values.get("cusid") == null) {
/**
*
*/
values.put("cusid", values.get("id"));
}
pages.incrementAndGet();
event.getDSData().getProcess().process(values);
/**
/*
* 访客信息表
*/
}
if (skipDataVal == true) { //跳过
if (skipDataVal) { //跳过
errors.incrementAndGet();
continue;
}
}
}
@ -292,9 +282,10 @@ public class ExcelImportProecess extends DataProcess {
}
}
if (event.getDSData().getFile().exists()) {
//noinspection ResultOfMethodCallIgnored
event.getDSData().getFile().delete();
}
/**
/*
* 更新数据
*/
MainContext.getContext().getBean(ReporterRepository.class).save(event.getDSData().getReport());
@ -317,10 +308,10 @@ public class ExcelImportProecess extends DataProcess {
}
}
private String getRefid(TableProperties tp, List<Object> dataList, String value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
private String getRefid(List<Object> dataList, String value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
String id = "";
for (Object data : dataList) {
Object target = null;
Object target;
if (PropertyUtils.isReadable(data, "name")) {
target = BeanUtils.getProperty(data, "name");
if (target != null && target.equals(value)) {
@ -364,29 +355,21 @@ public class ExcelImportProecess extends DataProcess {
return fileName.matches("^.+\\.(?i)(xlsx)$");
}
@SuppressWarnings("deprecation")
private String getValue(Cell cell) {
String strCell = "";
if (cell != null) {
short dt = cell.getCellStyle().getDataFormat();
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
case STRING:
strCell = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
case BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
strCell = "";
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
strCell = sdf.format(cell.getDateCellValue());
} else if (cell.getCellStyle().getDataFormat() == 58) {
// 处理自定义日期格式m月d日(通过判断单元格的格式id解决id的值是58)
@ -394,14 +377,9 @@ public class ExcelImportProecess extends DataProcess {
double value = cell.getNumericCellValue();
strCell = sdf.format(org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value));
} else {
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
strCell = sdf.format(cell.getDateCellValue());
} else {
boolean isNumber = isNumberFormat(dt);
@ -418,7 +396,7 @@ public class ExcelImportProecess extends DataProcess {
}
}
break;
case HSSFCell.CELL_TYPE_FORMULA: {
case FORMULA: {
// 判断当前的cell是否为Date
boolean isNumber = isNumberFormat(dt);
try {
@ -437,7 +415,7 @@ public class ExcelImportProecess extends DataProcess {
strCell = "";
break;
}
if (strCell.equals("") || strCell == null) {
if (strCell.equals("")) {
return "";
}
}
@ -450,59 +428,20 @@ public class ExcelImportProecess extends DataProcess {
if (cell != null) {
short dt = cell.getCellStyle().getDataFormat();
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
dataType = "string";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
case BOOLEAN:
dataType = "number";
break;
case HSSFCell.CELL_TYPE_BLANK:
case BLANK:
dataType = determineDataType(dt, HSSFDateUtil.isCellDateFormatted(cell), cell.getCellStyle().getDataFormat() == 58);
break;
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
dataType = "datetime";
} else {// 日期
dataType = "datetime";
}
} else if (cell.getCellStyle().getDataFormat() == 58) {
dataType = "datetime";
} else {
boolean isNumber = isNumberFormat(dt);
if (isNumber) {
dataType = "number";
} else {
dataType = "string";
}
dataType = determineDataType(dt, cell.getCellStyle().getDataFormat() == 58, HSSFDateUtil.isCellDateFormatted(cell));
}
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
dataType = "datetime";
} else {// 日期
dataType = "datetime";
}
} else if (cell.getCellStyle().getDataFormat() == 58) {
dataType = "datetime";
} else {
if (HSSFDateUtil.isCellDateFormatted(cell)) {
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
dataType = "datetime";
} else {// 日期
dataType = "datetime";
}
} else {
boolean isNumber = isNumberFormat(dt);
if (isNumber) {
dataType = "number";
} else {
dataType = "string";
}
}
}
break;
case HSSFCell.CELL_TYPE_FORMULA: {
case FORMULA: {
// 判断当前的cell是否为Date
boolean isNumber = isNumberFormat(dt);
if (isNumber) {
@ -521,12 +460,31 @@ public class ExcelImportProecess extends DataProcess {
return dataType;
}
private String determineDataType(short dt, boolean b, boolean cellDateFormatted) {
String dataType;
if (b) {
dataType = "datetime";
} else {
if (cellDateFormatted) {
dataType = "datetime";
} else {
boolean isNumber = isNumberFormat(dt);
if (isNumber) {
dataType = "number";
} else {
dataType = "string";
}
}
}
return dataType;
}
private DecimalFormat getNumberFormat(String dataformat) {
DecimalFormat numberFormat = null;
int index = dataformat.indexOf("_") > 0 ? dataformat.indexOf("_") : dataformat.indexOf(";");
if (index > 0) {
String format = dataformat.substring(0, index);
if (format.matches("[\\d.]{1,}")) {
if (format.matches("[\\d.]+")) {
numberFormat = new DecimalFormat(format);
}
}
@ -538,81 +496,32 @@ public class ExcelImportProecess extends DataProcess {
boolean number = false;
switch (dataType) {
case 180:
number = true;
break;
case 181:
number = true;
break;
case 182:
number = true;
break;
case 178:
number = true;
break;
case 177:
number = true;
break;
case 176:
number = true;
break;
case 183:
number = true;
break;
case 185:
number = true;
break;
case 186:
number = true;
break;
case 179:
number = true;
break;
case 187:
number = true;
break;
case 7:
number = true;
break;
case 8:
number = true;
break;
case 44:
number = true;
break;
case 10:
number = true;
break;
case 12:
number = true;
break;
case 13:
number = true;
break;
case 188:
number = true;
break;
case 189:
number = true;
break;
case 190:
number = true;
break;
case 191:
number = true;
break;
case 192:
number = true;
break;
case 193:
number = true;
break;
case 194:
number = true;
break;
case 11:
number = true;
break;
}
return number;
}