package com.norteksoft.product.api.impl; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; 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.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.bs.options.entity.ImportColumn; import com.norteksoft.bs.options.entity.ImportDefinition; import com.norteksoft.bs.options.enumeration.BusinessType; import com.norteksoft.bs.options.enumeration.ImportType; import com.norteksoft.bs.options.enumeration.ImportWay; import com.norteksoft.bs.options.service.ImportDefinitionManager; import com.norteksoft.mms.form.enumeration.DataType; import com.norteksoft.product.api.DataImporterCallBack; import com.norteksoft.product.api.DataImporterService; import com.norteksoft.product.util.ZipUtils; @Service @Transactional public class DataImporterServiceImpl implements DataImporterService { private final static String SEPARATOR = "\\\\"; public static final SimpleDateFormat SIMPLEDATEFORMAT1 = new SimpleDateFormat("yyyy-MM-dd"); public static final SimpleDateFormat SIMPLEDATEFORMAT2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired private ImportDefinitionManager importDefinitionManager; public String importData(File file, String fileName) throws Exception{ return importData(file, fileName, new DefaultDataImporterCallBack()); } public String importData(File file, String fileName,DataImporterCallBack callBack) throws Exception{ String result = ""; Workbook workBook = null; if(fileName.endsWith(".xls")){ workBook = new HSSFWorkbook(new FileInputStream(file)); result = importExcelData(workBook,callBack); }else if(fileName.endsWith(".xlsx")){ workBook = new XSSFWorkbook(new FileInputStream(file)); result = importExcelData(workBook,callBack); }else{ result = importTextData(file,fileName,callBack); } if(StringUtils.isEmpty(result)){ result="导入成功!"; } return result; } private String importTextData(File file, String fileName, DataImporterCallBack callBack) throws Exception{ String result = ""; if(fileName.lastIndexOf("_")==-1) return "文件名不符合要求,正确格式为:导入定义编号_ 文件名.文件格式!"; String code=fileName.substring(0, fileName.lastIndexOf("_")); ImportDefinition importDefinition=importDefinitionManager.getImportDefinitionByCode(code); if(importDefinition != null){ if(importDefinition.getImportColumns() !=null && importDefinition.getImportColumns().size()>0){ if(ImportType.TXT_DIVIDE.equals(importDefinition.getImportType())){ if(StringUtils.isEmpty(importDefinition.getDivide())){ result = "字段信息中的 分隔符没有填写!\n"; }else{ result = importTxtDivideData(file,importDefinition,callBack); } }else if(ImportType.TXT.equals(importDefinition.getImportType())){ String validateResult=validateImportTxtData(importDefinition); if(StringUtils.isEmpty(validateResult)){ result = importTxtData(file,importDefinition,callBack); }else{ result = validateResult; } }else{ result = "编号为 "+code+" 的导入定义中没有选择 导入类型 !"; } }else{ result = "编号为 "+code+" 的导入定义中没有录入导入列!"; } }else{ result = "导入管理中没有编号为 "+code+" 的导入定义!\n"; } return result; } public static String validateImportTxtData(ImportDefinition importDefinition){ String result=""; String relevanceResult=""; for(ImportColumn importColumn:importDefinition.getImportColumns()){ if(BusinessType.RELEVANCE_FIELD.equals(importColumn.getBusinessType()) && (StringUtils.isEmpty(importDefinition.getRelevanceName()) || StringUtils.isEmpty(importDefinition.getForeignKey()))){ relevanceResult="基本信息中的关联表名或外键没有填写!\n"; } if(importColumn.getWidth()==null || importColumn.getWidth()==0){ result+="字段信息中的 "+importColumn.getAlias()+" 字段固定长度没有填写!\n"; } } if(StringUtils.isNotEmpty(relevanceResult)) result+=relevanceResult; return result; } /** * 固定长度文本导入 * @param file * @param importDefinition * @return * @throws Exception */ private String importTxtData(File file, ImportDefinition importDefinition, DataImporterCallBack callBack) throws Exception{ FileInputStream fis= new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,ZipUtils.prexEncoding(file.getPath())); BufferedReader br = new BufferedReader(isr); String line=""; List<String> fileContent = new ArrayList<String>(); int i=0; while ((line=br.readLine())!=null){ if(i > 0) fileContent.add(line); i++; } br.close(); isr.close(); fis.close(); String result = ""; if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入 result = callBack.afterValidate(validateImport(fileContent,importDefinition)); if(StringUtils.isEmpty(result)){ result=insertIntoData(fileContent,importDefinition,callBack); }else{ return result; } }else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据 result=onlyImportRightData(fileContent,importDefinition,callBack); }else{//有错误数据就不导入 result=haveErrorNotImport(fileContent,importDefinition,callBack); } return result; } /** * 有错误数据就不导入 * @param fileContent * @param importDefinition * @param callBack */ private String haveErrorNotImport(List<String> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { String result=""; //导入定义中固定长度的总和 Integer rowWidth=importDefinitionManager.totalWidth(importDefinition.getId()); int rowNum=1;//文件行数 if(fileContent != null && fileContent.size()>0){ for (String row : fileContent) { String rowContent=row; if(rowWidth==rowContent.length()){ for(ImportColumn importColumn:importDefinition.getImportColumns()){ String columnContent=rowContent.substring(0,importColumn.getWidth()); rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length()); String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) return validateResult+"!" ; } }else{ return "第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth+"!"; } rowNum++; } }else{ return "导入的文件中没有数据!"; } String message=insertIntoData(fileContent,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){ return message; } return result; } /** * 固定长度导入验证 */ private List<String> validateImport(List<String> fileContent,ImportDefinition importDefinition) { //导入定义中固定长度的总和 Integer rowWidth=importDefinitionManager.totalWidth(importDefinition.getId()); List<String> result=new ArrayList<String>(); int rowNum=1;//文件行数 if(fileContent != null && fileContent.size()>0){ for (String row : fileContent) { String rowContent=row; if(rowWidth==rowContent.length()){ for(ImportColumn importColumn:importDefinition.getImportColumns()){ String columnContent=rowContent.substring(0,importColumn.getWidth()); rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length()); String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); } }else{ result.add("第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth); } rowNum++; } }else{ result.add("导入的文件中没有数据"); } return result; } /** * 只导入正确数据 * @param fileContent * @param importDefinition * @param callBack */ private String onlyImportRightData(List<String> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { //导入定义中固定长度的总和 Integer rowWidth=importDefinitionManager.totalWidth(importDefinition.getId()); List<String> result1=new ArrayList<String>(); int rowNum=1;//文件行数 if(fileContent != null && fileContent.size()>0){ for (String row : fileContent) { String rowContent=row; List<String> result=new ArrayList<String>(); if(rowWidth==rowContent.length()){ for(ImportColumn importColumn:importDefinition.getImportColumns()){ String columnContent=rowContent.substring(0,importColumn.getWidth()); rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length()); String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); } }else{ result.add("第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth); } if(result.size()==0){//该行没有错误信息 String message=importTxtRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result1.add(message); } } }else{//该行有错误信息 for(String str:result){ result1.add(str); } } rowNum++; } callBack.afterSaveAllRows(); }else{ result1.add("导入的文件中没有数据"); } if(result1.size()==0){ result1.add("导入文件成功"); } return callBack.afterValidate(result1); } //INSERT INTO BS_IMPORT_DEFINITION(company_id,creator,created_time) VALUES(8,'test1','2012-09-26 16:00:01'); private String insertIntoData(List<String> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { List<String> result=new ArrayList<String>(); for (String row : fileContent) { String message=importTxtRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result.add(message); } } } callBack.afterSaveAllRows(); if(result.size()>0){ return callBack.afterValidate(result); }else{ return ""; } } private String importTxtRowData(String rowContent,ImportDefinition importDefinition, DataImporterCallBack callBack){ List<String> rowValues=new ArrayList<String>(); Date currentDate=new Date(); for(ImportColumn importColumn:importDefinition.getImportColumns()){ String columnValue=(rowContent.substring(0,importColumn.getWidth())).trim(); if(StringUtils.isEmpty(columnValue) && StringUtils.isNotEmpty(importColumn.getDefaultValue())){ columnValue=importColumn.getDefaultValue().trim(); } rowValues.add(packagingColumnValue(importColumn,columnValue,currentDate)); rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length()); } String[] rowValue=rowValues.toArray(new String[rowValues.size()]); return saveSingleRowData(rowValue, importDefinition, callBack); } /** * 分隔符分隔的文本导入 * @param file * @param importDefinition * @return * @throws Exception */ private String importTxtDivideData(File file,ImportDefinition importDefinition, DataImporterCallBack callBack) throws Exception{ int columnAmount=importDefinition.getImportColumns().size(); String separators=importDefinition.getDivide(); FileInputStream fis= new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,ZipUtils.prexEncoding(file.getPath())); BufferedReader br = new BufferedReader(isr); String line=""; List<String[]> fileContent = new ArrayList<String[]>(); int i=0; while ((line=br.readLine())!=null){ if(i > 0){ String[] columnContent ; if(separators.equals("\\")){ columnContent = line.split(SEPARATOR); }else{ columnContent = line.split(separators); } List<String> columns =Arrays.asList(columnContent); List<String> values=new ArrayList<String>(); values.addAll(columns); if(columnContent.length<columnAmount){ for(int m=0;m<columnAmount-columnContent.length;m++){ values.add(""); } } fileContent.add(values.toArray(new String[columnAmount])); } i++; } br.close(); isr.close(); fis.close(); String result = ""; if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入 result = callBack.afterValidate(validateSeparatorsImport(fileContent,importDefinition)); if(StringUtils.isEmpty(result)){ result=insertIntoSeparatorsData(fileContent,importDefinition,callBack); }else{ return result; } }else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据 result=onlyImportTxtDivideRightData(fileContent, importDefinition, callBack); }else{ result=haveErrorNotImportTxtDivide(fileContent, importDefinition, callBack); } return result; } /** * 有错误数据就不导入 * @param fileContent * @param importDefinition * @param callBack */ private String haveErrorNotImportTxtDivide(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { String result=""; int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ return relevance+"!"; } if(fileContent != null && fileContent.size()>0){ for (String[] row : fileContent) { int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) return validateResult+"!"; i++; } rowNum++; } }else{ return "导入的文件中没有数据!"; } String message=insertIntoSeparatorsData(fileContent,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){ result=message; } return result; } /** * 只导入正确数据 * @param fileContent * @param importDefinition * @param callBack */ private String onlyImportTxtDivideRightData(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { List<String> result1=new ArrayList<String>(); int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ return relevance+"!"; } if(fileContent != null && fileContent.size()>0){ for (String[] row : fileContent) { List<String> result=new ArrayList<String>(); int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); i++; } if(result.size()==0){//该行没有错误信息 String message=insertIntoSeparatorsRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result1.add(message); } } }else{//该行有错误信息 for(String str:result){ result1.add(str); } } rowNum++; } callBack.afterSaveAllRows(); }else{ result1.add("导入的文件中没有数据"); } if(result1.size()==0){ result1.add("导入文件成功"); } return callBack.afterValidate(result1); } private String insertIntoSeparatorsData(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { List<String> result=new ArrayList<String>(); for (String row[] : fileContent) { String message=insertIntoSeparatorsRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result.add(message); } } } callBack.afterSaveAllRows(); if(result.size()>0){ return callBack.afterValidate(result); }else{ return ""; } } /** * 分隔符分隔文本插入一行数据 * 返回值不为空说明没有给要导入的数据表名,为空说明插入成功 */ private String insertIntoSeparatorsRowData(String[] rowContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { int i=0; List<String> rowValues=new ArrayList<String>(); Date currentDate=new Date(); for(ImportColumn importColumn:importDefinition.getImportColumns()){ String columnValue=rowContent[i].trim(); if(StringUtils.isEmpty(columnValue) && StringUtils.isNotEmpty(importColumn.getDefaultValue())){ columnValue=importColumn.getDefaultValue().trim(); } rowValues.add(packagingColumnValue(importColumn,columnValue,currentDate)); i++; } String[] rowValue=rowValues.toArray(new String[rowValues.size()]); return saveSingleRowData(rowValue, importDefinition, callBack); } private String packagingColumnValue(ImportColumn importColumn,String columnValue, Date currentDate){ String column=""; if((DataType.LONG.equals(importColumn.getDataType())||DataType.INTEGER.equals(importColumn.getDataType()))&&columnValue.contains(".")){//excel的整形数据会带小数点 column=columnValue.substring(0,columnValue.indexOf(".")); }else if(DataType.DATE.equals(importColumn.getDataType()) && "${createdTime}".equals(columnValue)){ column=SIMPLEDATEFORMAT1.format(currentDate); }else if(DataType.TIME.equals(importColumn.getDataType()) && "${createdTime}".equals(columnValue)){ column=SIMPLEDATEFORMAT2.format(currentDate); }else{ column=columnValue; } return column; } /** * 验证分隔符分隔的文本 * @param fileContent * @param importDefinition * @return */ private List<String> validateSeparatorsImport(List<String[]> fileContent,ImportDefinition importDefinition) { List<String> result=new ArrayList<String>(); int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ result.add(relevance); } if(fileContent != null && fileContent.size()>0){ for (String row[] : fileContent) { int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); i++; } rowNum++; } }else{ result.add("导入的文件中没有数据"); } return result; } /** * Excel导入 * @param importDefinition * @param workBook * @return * @throws Exception */ private String importExcelData(Workbook workBook, DataImporterCallBack callBack) throws Exception{ String result = ""; if(workBook!=null){ int numberOfSheets = workBook.getNumberOfSheets(); for(int i=0;i<numberOfSheets;i++){ Sheet sheet = workBook.getSheetAt(i); String code=sheet.getSheetName(); ImportDefinition importDefinition=importDefinitionManager.getImportDefinitionByCode(code); if(importDefinition != null){ if(importDefinition.getImportColumns() !=null && importDefinition.getImportColumns().size()>0){ String sheetResult = resolvingExcelData(sheet,callBack,importDefinition); if("success".equals(sheetResult)){ result+="Sheet名为 "+code+" 的文件导入成功!\n"; }else{ result+=sheetResult; } }else{ result += "编号为 "+importDefinition.getCode()+" 的导入定义中没有录入导入列!\n"; } }else{ result += "导入管理中没有编号为 "+code+" 的导入定义!\n"; } } }else{ result="导入文件中没有内容!"; } return result; } /** * 解析数据 * @param sheet * @param callBack * @param importDefinition */ private String resolvingExcelData(Sheet sheet, DataImporterCallBack callBack,ImportDefinition importDefinition) { String result = ""; int firstRowNum = sheet.getFirstRowNum(); int lastRowNum = sheet.getLastRowNum(); List<String[]> list = new ArrayList<String[]>(); int columnAmount=importDefinition.getImportColumns().size(); for(int i = firstRowNum+1; i <= lastRowNum; i++){ List<String> columns = new ArrayList<String>(); Row rowData = sheet.getRow(i); if(rowData == null) continue; for (int j = 0; j <= rowData.getLastCellNum()-1; j++) { Cell cell = rowData.getCell(j); if(cell==null){ columns.add(""); }else{ columns.add(getCellValue(cell)==null?"":getCellValue(cell).toString()); } } if(rowData.getLastCellNum()<columnAmount){ for(int m=0;m<columnAmount-rowData.getLastCellNum();m++){ columns.add(""); } } list.add(columns.toArray(new String[columnAmount])); } if(list.size()>0){ result=resolvingImportData(list,importDefinition,callBack); }else{ result="Sheet名为 "+importDefinition.getCode()+" 的文件中没有内容!\n"; } return result; } private String resolvingImportData(List<String[]> list,ImportDefinition importDefinition,DataImporterCallBack callBack){ String result=""; if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入 result = callBack.afterValidate(validateExcelImport(list,importDefinition)); if(StringUtils.isEmpty(result)){ String message=insertIntoExcelData(list,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){ result=message; }else{ result="success"; } }else{ return result; } }else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据 result = onlyImportExcelRightData(list, importDefinition, callBack); }else{ result = haveErrorNotImportExcel(list, importDefinition, callBack); } return result; } /** * 有错误数据就不导入 * @param fileContent * @param importDefinition * @param callBack */ private String haveErrorNotImportExcel(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { String result = ""; int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ return relevance+"!"; } if(fileContent != null && fileContent.size()>0){ for (String[] row : fileContent) { int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) return validateResult+"!"; i++; } rowNum++; } }else{ return "导入的文件中没有数据!"; } String message=insertIntoExcelData(fileContent,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){ result=message; } return result; } /** * 只导入正确数据 * @param fileContent * @param importDefinition * @param callBack */ private String onlyImportExcelRightData(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { List<String> result1 = new ArrayList<String>(); int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ return relevance+"!"; } if(fileContent != null && fileContent.size()>0){ for (String[] row : fileContent) { List<String> result = new ArrayList<String>(); int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); i++; } if(result.size()==0){//该行没有错误信息 String message=insertIntoSeparatorsRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result1.add(message); } } }else{//该行有错误信息 for(String str:result){ result1.add(str); } } rowNum++; } callBack.afterSaveAllRows(); }else{ result1.add("导入的文件中没有数据"); } if(result1.size()==0){ result1.add("导入文件成功"); } return callBack.afterValidate(result1); } private String saveSingleRowData(String[] rowValue,ImportDefinition importDefinition, DataImporterCallBack callBack) { String result=""; if(callBack.beforeSaveSingleRow(rowValue,importDefinition)){ result=callBack.saveSingleRow(rowValue,importDefinition); callBack.afterSaveSingleRow(rowValue,importDefinition); } return result; } private String insertIntoExcelData(List<String[]> fileContent,ImportDefinition importDefinition, DataImporterCallBack callBack) { List<String> result=new ArrayList<String>(); for (String[] row : fileContent) { String message=insertIntoSeparatorsRowData(row,importDefinition,callBack); if(StringUtils.isNotEmpty(message)){//message不为空说明没有给要导入的数据表名 if("no_table_name".equals(message)){ return "没有给数据表名!"; }else if("no_company_id".equals(message)){ return "没有取到公司id!"; }else{ result.add(message); } } } callBack.afterSaveAllRows(); if(result.size()>0){ return callBack.afterValidate(result); }else{ return ""; } } private String validateRelevance(ImportDefinition importDefinition){ for(ImportColumn importColumn:importDefinition.getImportColumns()){ if(BusinessType.RELEVANCE_FIELD.equals(importColumn.getBusinessType()) && (StringUtils.isEmpty(importDefinition.getRelevanceName()) || StringUtils.isEmpty(importDefinition.getForeignKey()))){ return "基本信息中的关联表名或外键没有填写"; } } return ""; } private List<String> validateExcelImport(List<String[]> fileContent,ImportDefinition importDefinition) { List<String> result = new ArrayList<String>(); int rowNum=1;//文件行数 String relevance =validateRelevance(importDefinition); if(StringUtils.isNotEmpty(relevance)){ result.add(relevance); } if(fileContent != null && fileContent.size()>0){ for (String[] row : fileContent) { int i=0; for(ImportColumn importColumn:importDefinition.getImportColumns()){ String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum); if(StringUtils.isNotEmpty(validateResult)) result.add(validateResult); i++; } rowNum++; } }else{ result.add("导入的文件中没有数据"); } return result; } private String validateColumnDataType(ImportColumn importColumn,String columnContent,int rowNum){ String validateResult=""; if(importColumn.getNotNull()){ if(StringUtils.isEmpty(importColumn.getDefaultValue())){//该字段不能为空,并且没有默认值 if(StringUtils.isEmpty(columnContent)){ validateResult="第"+rowNum+"行"+importColumn.getAlias()+"为空"; }else{ validateResult=validateDataType(importColumn.getDataType(),columnContent,rowNum,importColumn.getAlias(),false); } }else if(StringUtils.isNotEmpty(importColumn.getDefaultValue())){//该字段不能为空,并且有默认值 //验证默认值的数据类型是否正确 validateResult=validateDataType(importColumn.getDataType(),importColumn.getDefaultValue().trim(),0,importColumn.getAlias(),true); } }else{ validateResult=validateDataType(importColumn.getDataType(),columnContent,rowNum,importColumn.getAlias(),false); } return validateResult; } /** * 验证数据类型 * @param dataType * @param columnContent * @return */ public static String validateDataType(DataType dataType, String columnContent,int rowNum,String alias,boolean isDefaultValue) { if(StringUtils.isEmpty(columnContent)) return ""; String result = ""; if(DataType.DATE.equals(dataType)){ if(!"${createdTime}".equals(columnContent) && !columnContent.matches("\\d{4}-\\d{2}-d{2}")){ if(isDefaultValue) result=defaultValueMessage(alias); else result=dataMessage(rowNum,alias); result+="不是日期类型的数据"; } }else if(!"${createdTime}".equals(columnContent) && DataType.TIME.equals(dataType)){ if(!columnContent.matches("\\d{4}-\\d{2}-d{2}")){ if(isDefaultValue) result=defaultValueMessage(alias); else result=dataMessage(rowNum,alias); result+="不是时间类型的数据"; } }else if(DataType.BOOLEAN.equals(dataType)){ if(!("0".equals(columnContent) || "1".equals(columnContent) || "true".equals(columnContent) || "false".equals(columnContent))){ if(isDefaultValue) result=defaultValueMessage(alias); else result=dataMessage(rowNum,alias); result+="不是布尔类型的数据"; } }else if(DataType.DOUBLE.equals(dataType)||DataType.FLOAT.equals(dataType)||DataType.AMOUNT.equals(dataType)||DataType.NUMBER.equals(dataType)){ if(!(columnContent.matches("^(-?\\d+)(\\.\\d+)?$") || columnContent.matches("^-?\\d+$"))){ if(isDefaultValue) result=defaultValueMessage(alias); else result=dataMessage(rowNum,alias); result+="不是浮点类型的数据"; } }else if(DataType.LONG.equals(dataType)||DataType.INTEGER.equals(dataType)){ String column=""; if(columnContent.contains(".")){//excel的整形数据会带小数点 column=columnContent.substring(0,columnContent.indexOf(".")); }else{ column=columnContent; } if(!column.matches("^-?\\d+$")){ if(isDefaultValue) result=defaultValueMessage(alias); else result=dataMessage(rowNum,alias); result+="不是整数类型的数据"; } } return result; } private static String dataMessage(int rowNum,String alias){ return "第"+rowNum+"行"+alias; } private static String defaultValueMessage(String alias){ return "字段信息中的 "+alias+" 字段的默认值"; } public static Object getCellValue(Cell cell){ if(cell!=null){ Object object = null; switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: object = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_FORMULA: object = cell.getCellFormula(); break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { double d = cell.getNumericCellValue(); Date date = DateUtil.getJavaDate(d); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); object = format.format(date); } else{ object = cell.getNumericCellValue(); } break; case Cell.CELL_TYPE_STRING: object = cell.getStringCellValue(); break; case Cell.CELL_TYPE_ERROR: object = cell.getErrorCellValue(); break; } return object; }else{ return null; } } }