From a2c3c7a3032ac93bbcfd83f055b036f7e8b6c20b Mon Sep 17 00:00:00 2001 From: songhuangfeng123 <shf18767906695@163.com> Date: 星期三, 27 七月 2022 18:13:00 +0800 Subject: [PATCH] fix --- goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java | 758 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 758 insertions(+), 0 deletions(-) diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java new file mode 100644 index 0000000..a8f9759 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java @@ -0,0 +1,758 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import com.gkhy.safePlatform.targetDuty.utils.DateUtils; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ComparatorUtils; +import org.apache.commons.collections.comparators.ComparableComparator; +import org.apache.commons.collections.comparators.ComparatorChain; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * The <code>ExcelUtil</code> 与 {@link ExcelCell}搭配使用 + * + */ +public class ExcelUtil { + + private static Logger LG = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * 用来验证excel与Vo中的类型是否一致 <br> + * Map<栏位类型,只能是哪些Cell类型> + */ + private static Map<Class<?>, CellType[]> validateMap = new HashMap<>(); + + static { + validateMap.put(String[].class, new CellType[]{CellType.STRING}); + validateMap.put(Double[].class, new CellType[]{CellType.NUMERIC}); + validateMap.put(String.class, new CellType[]{CellType.STRING}); + validateMap.put(Double.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Timestamp.class, new CellType[]{CellType.NUMERIC, CellType.STRING}); + validateMap.put(Date.class, new CellType[]{CellType.NUMERIC, CellType.STRING}); + validateMap.put(Integer.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Float.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Long.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Boolean.class, new CellType[]{CellType.BOOLEAN}); + } + + /** + * 获取cell类型的文字描述 + * + * @param cellType <pre> + * CellType.BLANK + * CellType.BOOLEAN + * CellType.ERROR + * CellType.FORMULA + * CellType.NUMERIC + * CellType.STRING + * </pre> + * @return + */ + private static String getCellTypeByInt(CellType cellType) { + if(cellType == CellType.BLANK) + return "Null type"; + else if(cellType == CellType.BOOLEAN) + return "Boolean type"; + else if(cellType == CellType.ERROR) + return "Error type"; + else if(cellType == CellType.FORMULA) + return "Formula type"; + else if(cellType == CellType.NUMERIC) + return "Numeric type"; + else if(cellType == CellType.STRING) + return "String type"; + else + return "Unknown type"; + } + + /** + * 获取单元格值 + * + * @param cell + * @return + */ + private static Object getCellValue(Cell cell) { + if (cell == null + || (cell.getCellTypeEnum() == CellType.STRING && isBlank(cell + .getStringCellValue()))) { + return null; + } + DataFormatter dataFormatter = new DataFormatter(); + String s = dataFormatter.formatCellValue(cell); + return s; + +// CellType cellType = cell.getCellTypeEnum(); +// if(cellType == CellType.BLANK) +// return null; +// else if(cellType == CellType.BOOLEAN) +// return cell.getBooleanCellValue(); +// else if(cellType == CellType.ERROR) +// return cell.getErrorCellValue(); +// else if(cellType == CellType.FORMULA) { +// try { +// if (HSSFDateUtil.isCellDateFormatted(cell)) { +// return cell.getDateCellValue(); +// } else { +// return cell.getNumericCellValue(); +// } +// } catch (IllegalStateException e) { +// return cell.getRichStringCellValue(); +// } +// } +// else if(cellType == CellType.NUMERIC){ +// if (DateUtil.isCellDateFormatted(cell)) { +// return cell.getDateCellValue(); +// } else { +// return cell.getNumericCellValue(); +// } +// } +// else if(cellType == CellType.STRING) +// return cell.getStringCellValue(); +// else +// return null; + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于单个sheet + * + * @param <T> + * @param headers 表格属性列名数组 + * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 + * javabean属性的数据类型有基本数据类型及String,Date,String[],Double[] + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + */ + public static <T> void exportExcel(Map<String,String> headers, Collection<T> dataset, OutputStream out) { + exportExcel(headers, dataset, out, null); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于单个sheet + * + * @param <T> + * @param headers 表格属性列名数组 + * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 + * javabean属性的数据类型有基本数据类型及String,Date,String[],Double[] + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" + */ + public static <T> void exportExcel(Map<String,String> headers, Collection<T> dataset, OutputStream out, + String pattern) { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(); + + write2Sheet(workbook,sheet, headers, dataset, pattern); + try { + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + + public static void exportExcel(String[][] datalist, OutputStream out,boolean autoColumnWidth) { + try { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(); + + for (int i = 0; i < datalist.length; i++) { + String[] r = datalist[i]; + HSSFRow row = sheet.createRow(i); + for (int j = 0; j < r.length; j++) { + HSSFCell cell = row.createCell(j); + //cell max length 32767 + if (r[j] != null && r[j].length() > 32767) { + r[j] = "--此字段过长(超过32767),已被截断--" + r[j]; + r[j] = r[j].substring(0, 32766); + } + cell.setCellValue(r[j]); + } + } + //自动列宽 + if(autoColumnWidth) { + if (datalist.length > 0) { + int colcount = datalist[0].length; + for (int i = 0; i < colcount; i++) { + sheet.autoSizeColumn(i); + } + } + } + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + public static void exportExcel(String[][] datalist, OutputStream out) { + exportExcel(datalist,out,true); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于多个sheet + * + * @param <T> + * @param sheets {@link ExcelSheet}的集合 + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + */ + public static <T> void exportExcel(List<ExcelSheet<T>> sheets, OutputStream out) { + exportExcel(sheets, out, null); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于多个sheet + * + * @param <T> + * @param sheets {@link ExcelSheet}的集合 + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" + */ + public static <T> void exportExcel(List<ExcelSheet<T>> sheets, OutputStream out, String pattern) { + if (CollectionUtils.isEmpty(sheets)) { + return; + } + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + for (ExcelSheet<T> sheet : sheets) { + // 生成一个表格 + HSSFSheet hssfSheet = workbook.createSheet(sheet.getSheetName()); + write2Sheet(workbook,hssfSheet, sheet.getHeaders(), sheet.getDataset(), pattern); + } + try { + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + + /** + * 每个sheet的写入 + * + * @param sheet 页签 + * @param headers 表头 + * @param dataset 数据集合 + * @param pattern 日期格式 + */ + private static <T> void write2Sheet(HSSFWorkbook workbook,HSSFSheet sheet, Map<String,String> headers, Collection<T> dataset, + String pattern) { + //时间格式默认"yyyy-MM-dd" + if (isBlank(pattern)){ + pattern = "yyyy-MM-dd"; + } + // 产生表格标题行 + HSSFRow row = sheet.createRow(0); + // 标题行转中文 + Set<String> keys = headers.keySet(); + Iterator<String> it1 = keys.iterator(); + String key = ""; //存放临时键变量 + int c= 0; //标题列数 + while (it1.hasNext()){ + key = it1.next(); + if (headers.containsKey(key)) { + HSSFCell cell = row.createCell(c); + cell.setCellStyle(getTopColumnStyle(workbook)); + HSSFRichTextString text = new HSSFRichTextString(headers.get(key)); + cell.setCellValue(text); + c++; + } + } + + // 遍历集合数据,产生数据行 + Iterator<T> it = dataset.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + T t = it.next(); + try { + if (t instanceof Map) { + @SuppressWarnings("unchecked") + Map<String, Object> map = (Map<String, Object>) t; + int cellNum = 0; + //遍历列名 + Iterator<String> it2 = keys.iterator(); + while (it2.hasNext()){ + key = it2.next(); + if (!headers.containsKey(key)) { + LG.error("Map 中 不存在 key [" + key + "]"); + continue; + } + Object value = map.get(key); + HSSFCell cell = row.createCell(cellNum); + cell.setCellStyle(getColumnStyle(workbook)); + + cellNum = setCellValue(cell,value,pattern,cellNum,null,row); + + cellNum++; + } + } else { + List<FieldForSortting> fields = sortFieldByAnno(t.getClass()); + int cellNum = 0; + for (int i = 0; i < fields.size(); i++) { + HSSFCell cell = row.createCell(cellNum); + cell.setCellStyle(getColumnStyle(workbook)); + Field field = fields.get(i).getField(); + field.setAccessible(true); + Object value = field.get(t); + + cellNum = setCellValue(cell,value,pattern,cellNum,field,row); + + cellNum++; + } + } + } catch (Exception e) { + LG.error(e.toString(), e); + } + } + // 设定自动宽度 + for (int i = 0; i < headers.size(); i++) { + sheet.autoSizeColumn(i); + int cw = (int) (sheet.getColumnWidth(i) * 0.8); + // increase width to accommodate drop-down arrow in the header + sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 20 / 10); + } + } + + private static int setCellValue(HSSFCell cell,Object value,String pattern,int cellNum,Field field,HSSFRow row){ + String textValue = null; + if (value instanceof Integer) { + int intValue = (Integer) value; + cell.setCellValue(intValue); + } else if (value instanceof Float) { + float fValue = (Float) value; + cell.setCellValue(fValue); + } else if (value instanceof Double) { + double dValue = (Double) value; + cell.setCellValue(dValue); + } else if (value instanceof Long) { + long longValue = (Long) value; + cell.setCellValue(longValue); + } else if (value instanceof Boolean) { + boolean bValue = (Boolean) value; + cell.setCellValue(bValue); + } else if (value instanceof Date) { + Date date = (Date) value; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + textValue = sdf.format(date); + } else if (value instanceof String[]) { + String[] strArr = (String[]) value; + for (int j = 0; j < strArr.length; j++) { + String str = strArr[j]; + cell.setCellValue(str); + if (j != strArr.length - 1) { + cellNum++; + cell = row.createCell(cellNum); + } + } + } else if (value instanceof Double[]) { + Double[] douArr = (Double[]) value; + for (int j = 0; j < douArr.length; j++) { + Double val = douArr[j]; + // 值不为空则set Value + if (val != null) { + cell.setCellValue(val); + } + + if (j != douArr.length - 1) { + cellNum++; + cell = row.createCell(cellNum); + } + } + } else { + // 其它数据类型都当作字符串简单处理 + String empty = ""; + if(field != null) { + ExcelCell anno = field.getAnnotation(ExcelCell.class); + if (anno != null) { + empty = anno.defaultValue(); + } + } + textValue = value == null ? empty : value.toString(); + } + if (textValue != null) { + HSSFRichTextString richString = new HSSFRichTextString(textValue); + cell.setCellValue(richString); + } + return cellNum; + } + + + /* + * 设置单元格样式 + */ + private static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) { + + //设置样式; + HSSFCellStyle style = workbook.createCellStyle(); + //设置自动换行; + style.setWrapText(false); + //设置水平对齐的样式为居中对齐; + style.setAlignment(HorizontalAlignment.CENTER); + //设置垂直对齐的样式为居中对齐; + style.setVerticalAlignment(VerticalAlignment.CENTER); + + return style; + } + + /* + * 设置单元格样式 + */ + private static HSSFCellStyle getTopColumnStyle(HSSFWorkbook workbook) { + + //设置样式; + HSSFCellStyle style = workbook.createCellStyle(); + //设置自动换行; + style.setWrapText(true); + //设置水平对齐的样式为居中对齐; + style.setAlignment(HorizontalAlignment.CENTER); + //设置垂直对齐的样式为居中对齐; + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());// 设置背景色 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 设置字体 + HSSFFont font = workbook.createFont(); + //字体加粗 + font.setBold(true); + font.setFontHeightInPoints((short) 14);//设置字体大小 + font.setColor(IndexedColors.WHITE.index); + style.setFont(font); + return style; + } + + /** + * 把Excel的数据封装成voList + * + * @param clazz vo的Class + * @param inputStream excel输入流 + * @param pattern 如果有时间数据,设定输入格式。默认为"yyy-MM-dd" + * @param logs 错误log集合 + * @param arrayCount 如果vo中有数组类型,那就按照index顺序,把数组应该有几个值写上. + * @return voList + * @throws RuntimeException + */ + public static <T> Collection<T> importExcel(Class<T> clazz, InputStream inputStream, + String pattern, ExcelLogs logs, Integer... arrayCount) { + Workbook workBook; + try { + workBook = WorkbookFactory.create(inputStream); + } catch (Exception e) { + LG.error("load excel file error",e); + return null; + } + List<T> list = new ArrayList<>(); + Sheet sheet = workBook.getSheetAt(0); + Iterator<Row> rowIterator = sheet.rowIterator(); + try { + List<ExcelLog> logList = new ArrayList<>(); + // Map<title,index> + Map<String, Integer> titleMap = new HashMap<>(); + + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + if (row.getRowNum() == 0) { + if (clazz == Map.class) { + // 解析map用的key,就是excel标题行 + Iterator<Cell> cellIterator = row.cellIterator(); + Integer index = 0; + while (cellIterator.hasNext()) { + String value = cellIterator.next().getStringCellValue(); + titleMap.put(value, index); + index++; + } + } + continue; + } + // 整行都空,就跳过 + boolean allRowIsNull = true; + Iterator<Cell> cellIterator = row.cellIterator(); + while (cellIterator.hasNext()) { + Object cellValue = getCellValue(cellIterator.next()); + if (cellValue != null) { + allRowIsNull = false; + break; + } + } + if (allRowIsNull) { + LG.warn("Excel row " + row.getRowNum() + " all row value is null!"); + continue; + } + StringBuilder log = new StringBuilder(); + if (clazz == Map.class) { + Map<String, Object> map = new HashMap<>(); + for (String k : titleMap.keySet()) { + Integer index = titleMap.get(k); + Cell cell = row.getCell(index); + // 判空 + if (cell == null) { + map.put(k, null); + } else { + cell.setCellType(CellType.STRING); + String value = cell.getStringCellValue(); + map.put(k, value); + } + } + list.add((T) map); + + } else { + T t = clazz.newInstance(); + int arrayIndex = 0;// 标识当前第几个数组了 + int cellIndex = 0;// 标识当前读到这一行的第几个cell了 + List<FieldForSortting> fields = sortFieldByAnno(clazz); + for (FieldForSortting ffs : fields) { + Field field = ffs.getField(); + field.setAccessible(true); + if (field.getType().isArray()) { + Integer count = arrayCount[arrayIndex]; + Object[] value; + if (field.getType().equals(String[].class)) { + value = new String[count]; + } else { + // 目前只支持String[]和Double[] + value = new Double[count]; + } + for (int i = 0; i < count; i++) { + Cell cell = row.getCell(cellIndex); + String errMsg = validateCell(cell, field, cellIndex); + if (isBlank(errMsg)) { + value[i] = getCellValue(cell); + } else { + log.append(errMsg); + log.append(";"); + logs.setHasError(true); + } + cellIndex++; + } + field.set(t, value); + arrayIndex++; + } else { + Cell cell = row.getCell(cellIndex); + String errMsg = validateCell(cell, field, cellIndex); + if (isBlank(errMsg)) { + Object value = null; + // 处理特殊情况,Excel中的String,转换成Bean的Date + if (field.getType().equals(Timestamp.class)) { + Object strDate = getCellValue(cell); + value = DateUtils.string2Timestamp(strDate.toString(),pattern); + }else if (field.getType().equals(Integer.class)) { + Object data = getCellValue(cell); + if(data != null){ + value = Integer.parseInt(String.valueOf(data)); + } + } else { + value = getCellValue(cell); + // 处理特殊情况,excel的value为String,且bean中为其他,且defaultValue不为空,那就=defaultValue + ExcelCell annoCell = field.getAnnotation(ExcelCell.class); + if (value instanceof String && !field.getType().equals(String.class) + && isNotBlank(annoCell.defaultValue())) { + value = annoCell.defaultValue(); + } + } + field.set(t, value); + } + if (isNotBlank(errMsg)) { + log.append(errMsg); + log.append(";"); + logs.setHasError(true); + } + cellIndex++; + } + } + list.add(t); + logList.add(new ExcelLog(t, log.toString(), row.getRowNum() + 1)); + } + } + logs.setLogList(logList); + } catch (InstantiationException e) { + throw new RuntimeException(MessageFormat.format("can not instance class:{0}", + clazz.getSimpleName()), e); + } catch (IllegalAccessException e) { + throw new RuntimeException(MessageFormat.format("can not instance class:{0}", + clazz.getSimpleName()), e); + } + return list; + } + + /** + * 驗證Cell類型是否正確 + * + * @param cell cell單元格 + * @param field 欄位 + * @param cellNum 第幾個欄位,用於errMsg + * @return + */ + private static String validateCell(Cell cell, Field field, int cellNum) { + String columnName = CellReference.convertNumToColString(cellNum); + String result = null; + CellType[] cellTypeArr = validateMap.get(field.getType()); + if (cellTypeArr == null) { + result = MessageFormat.format("Unsupported type [{0}]", field.getType().getSimpleName()); + return result; + } + ExcelCell annoCell = field.getAnnotation(ExcelCell.class); + if (cell == null + || (cell.getCellTypeEnum() == CellType.STRING && isBlank(cell + .getStringCellValue()))) { + if (annoCell != null && annoCell.valid().allowNull() == false) { + result = MessageFormat.format("the cell [{0}] can not null", columnName); + } + ; + } +// else if (cell.getCellTypeEnum() == CellType.BLANK && annoCell.valid().allowNull()) { +// return result; +// } +// else { +// List<CellType> cellTypes = Arrays.asList(cellTypeArr); +// +// // 如果類型不在指定範圍內,並且沒有默認值 +// if (!(cellTypes.contains(cell.getCellTypeEnum())) +// || isNotBlank(annoCell.defaultValue()) +// && cell.getCellTypeEnum() == CellType.STRING) { +// StringBuilder strType = new StringBuilder(); +// for (int i = 0; i < cellTypes.size(); i++) { +// CellType cellType = cellTypes.get(i); +// strType.append(getCellTypeByInt(cellType)); +// if (i != cellTypes.size() - 1) { +// strType.append(","); +// } +// } +// result = +// MessageFormat.format("the cell [{0}] type must [{1}]", columnName, strType.toString()); +// } else { +// // 类型符合验证,但值不在要求范围内的 +// // String in +// if (annoCell.valid().in().length != 0 && cell.getCellTypeEnum() == CellType.STRING) { +// String[] in = annoCell.valid().in(); +// String cellValue = cell.getStringCellValue(); +// boolean isIn = false; +// for (String str : in) { +// if (str.equals(cellValue)) { +// isIn = true; +// } +// } +// if (!isIn) { +// result = MessageFormat.format("the cell [{0}] value must in {1}", columnName, in); +// } +// } +// // 数字型 +// if (cell.getCellTypeEnum() == CellType.NUMERIC) { +// double cellValue = cell.getNumericCellValue(); +// // 小于 +// if (!Double.isNaN(annoCell.valid().lt())) { +// if (!(cellValue < annoCell.valid().lt())) { +// result = +// MessageFormat.format("the cell [{0}] value must less than [{1}]", columnName, +// annoCell.valid().lt()); +// } +// } +// // 大于 +// if (!Double.isNaN(annoCell.valid().gt())) { +// if (!(cellValue > annoCell.valid().gt())) { +// result = +// MessageFormat.format("the cell [{0}] value must greater than [{1}]", columnName, +// annoCell.valid().gt()); +// } +// } +// // 小于等于 +// if (!Double.isNaN(annoCell.valid().le())) { +// if (!(cellValue <= annoCell.valid().le())) { +// result = +// MessageFormat.format("the cell [{0}] value must less than or equal [{1}]", +// columnName, annoCell.valid().le()); +// } +// } +// // 大于等于 +// if (!Double.isNaN(annoCell.valid().ge())) { +// if (!(cellValue >= annoCell.valid().ge())) { +// result = +// MessageFormat.format("the cell [{0}] value must greater than or equal [{1}]", +// columnName, annoCell.valid().ge()); +// } +// } +// } +// } +// } + return result; + } + + /** + * 根据annotation的seq排序后的栏位 + * + * @param clazz + * @return + */ + private static List<FieldForSortting> sortFieldByAnno(Class<?> clazz) { + Field[] fieldsArr = clazz.getDeclaredFields(); + List<FieldForSortting> fields = new ArrayList<>(); + List<FieldForSortting> annoNullFields = new ArrayList<>(); + for (Field field : fieldsArr) { + ExcelCell ec = field.getAnnotation(ExcelCell.class); + if (ec == null) { + // 没有ExcelCell Annotation 视为不汇入 + continue; + } + int id = ec.index(); + fields.add(new FieldForSortting(field, id)); + } + fields.addAll(annoNullFields); + sortByProperties(fields, true, false, "index"); + return fields; + } + + private static void sortByProperties(List<? extends Object> list, boolean isNullHigh, + boolean isReversed, String... props) { + if (CollectionUtils.isNotEmpty(list)) { + Comparator<?> typeComp = ComparableComparator.getInstance(); + if (isNullHigh == true) { + typeComp = ComparatorUtils.nullHighComparator(typeComp); + } else { + typeComp = ComparatorUtils.nullLowComparator(typeComp); + } + if (isReversed) { + typeComp = ComparatorUtils.reversedComparator(typeComp); + } + + List<Object> sortCols = new ArrayList<Object>(); + + if (props != null) { + for (String prop : props) { + sortCols.add(new BeanComparator(prop, typeComp)); + } + } + if (sortCols.size() > 0) { + Comparator<Object> sortChain = new ComparatorChain(sortCols); + Collections.sort(list, sortChain); + } + } + } + + private static boolean isBlank(String str){ + if(str == null){ + return true; + } + return str.length() == 0; + } + + protected static boolean isNotBlank(String str){ + return !isBlank(str); + } + +} -- Gitblit v1.9.2