加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

excel工具类

发布时间:2020-12-14 06:22:39 所属栏目:Java 来源:网络整理
导读:来自:https://github.com/SargerasWang/ExcelUtil.git span style="color: #0000ff;"import span style="color: #000000;" org.apache.commons.beanutils.BeanComparator; span style="color: #0000ff;"import span style="color: #000000;" org.apache.com

来自:https://github.com/SargerasWang/ExcelUtil.git

<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.beanutils.BeanComparator;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.CollectionUtils;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.ComparatorUtils;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.comparators.ComparableComparator;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.comparators.ComparatorChain;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.lang3.StringUtils;
<span style="color: #0000ff;">import org.apache.poi.hssf.usermodel.*<span style="color: #000000;">;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.usermodel.Cell;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.usermodel.Row;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.util.CellReference;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.slf4j.Logger;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.slf4j.LoggerFactory;

<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.IOException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.InputStream;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.OutputStream;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.lang.reflect.Field;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.MessageFormat;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.ParseException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.SimpleDateFormat;
<span style="color: #0000ff;">import java.util.*<span style="color: #000000;">;

<span style="color: #008000;">/**<span style="color: #008000;">

  • The ExcelUtil 与 {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelCell}搭配使用

  • <span style="color: #808080;">@author<span style="color: #008000;"> sargeras.wang

  • <span style="color: #808080;">@version<span style="color: #008000;"> 1.0,Created at 2013年9月14日
    <span style="color: #008000;">*/
    <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ExcelUtil {

    <span style="color: #0000ff;">private <span style="color: #0000ff;">static Logger LG = LoggerFactory.getLogger(ExcelUtil.<span style="color: #0000ff;">class<span style="color: #000000;">);

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 用来验证excel与Vo中的类型是否一致
    • Map<栏位类型,只能是哪些Cell类型>
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static Map<Class<?>,Integer[]> validateMap = <span style="color: #0000ff;">new HashMap<Class<?>,Integer[]><span style="color: #000000;">();

    <span style="color: #0000ff;">static<span style="color: #000000;"> {
    validateMap.put(String[].<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_STRING});
    validateMap.put(Double[].<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
    validateMap.put(String.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_STRING});
    validateMap.put(Double.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
    validateMap.put(Date.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC,Cell.CELL_TYPE_STRING});
    validateMap.put(Integer.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
    validateMap.put(Float.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
    validateMap.put(Long.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
    validateMap.put(Boolean.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_BOOLEAN});
    }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 获取cell类型的文字描述
    • <span style="color: #808080;">@param<span style="color: #008000;"> cellType
    • Cell.CELL_TYPE_BLANK
    • Cell.CELL_TYPE_BOOLEAN
    • Cell.CELL_TYPE_ERROR
    • Cell.CELL_TYPE_FORMULA
    • Cell.CELL_TYPE_NUMERIC
    • Cell.CELL_TYPE_STRING
    • <span style="color: #808080;">@return
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static String getCellTypeByInt(<span style="color: #0000ff;">int<span style="color: #000000;"> cellType) {
      <span style="color: #0000ff;">switch<span style="color: #000000;"> (cellType) {
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BLANK:
      <span style="color: #0000ff;">return "Null type"<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BOOLEAN:
      <span style="color: #0000ff;">return "Boolean type"<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_ERROR:
      <span style="color: #0000ff;">return "Error type"<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_FORMULA:
      <span style="color: #0000ff;">return "Formula type"<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_NUMERIC:
      <span style="color: #0000ff;">return "Numeric type"<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_STRING:
      <span style="color: #0000ff;">return "String type"<span style="color: #000000;">;
      <span style="color: #0000ff;">default<span style="color: #000000;">:
      <span style="color: #0000ff;">return "Unknown type"<span style="color: #000000;">;
      }
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 获取单元格值
    • <span style="color: #808080;">@param<span style="color: #008000;"> cell
    • <span style="color: #808080;">@return
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static<span style="color: #000000;"> Object getCellValue(Cell cell) {
      <span style="color: #0000ff;">if (cell == <span style="color: #0000ff;">null
      || (cell.getCellType() == Cell.CELL_TYPE_STRING &&<span style="color: #000000;"> StringUtils.isBlank(cell
      .getStringCellValue()))) {
      <span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
      }
      <span style="color: #0000ff;">int cellType =<span style="color: #000000;"> cell.getCellType();
      <span style="color: #0000ff;">switch<span style="color: #000000;"> (cellType) {
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BLANK:
      <span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BOOLEAN:
      <span style="color: #0000ff;">return<span style="color: #000000;"> cell.getBooleanCellValue();
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_ERROR:
      <span style="color: #0000ff;">return<span style="color: #000000;"> cell.getErrorCellValue();
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_FORMULA:
      <span style="color: #0000ff;">return<span style="color: #000000;"> cell.getNumericCellValue();
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_NUMERIC:
      <span style="color: #0000ff;">return<span style="color: #000000;"> cell.getNumericCellValue();
      <span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_STRING:
      <span style="color: #0000ff;">return<span style="color: #000000;"> cell.getStringCellValue();
      <span style="color: #0000ff;">default<span style="color: #000000;">:
      <span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
      }
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
    • 用于单个sheet
    • <span style="color: #808080;">@param<span style="color: #008000;">
    • <span style="color: #808080;">@param<span style="color: #008000;"> headers 表格属性列名数组
    • <span style="color: #808080;">@param<span style="color: #008000;"> dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
    • javabean属性的数据类型有基本数据类型及String,Date,String[],Double[]
    • <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(String[] headers,Collection<span style="color: #000000;"> dataset,OutputStream out) {
      exportExcel(headers,dataset,out,<span style="color: #0000ff;">null<span style="color: #000000;">);
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上

    • 用于单个sheet

    • <span style="color: #808080;">@param<span style="color: #008000;">

    • <span style="color: #808080;">@param<span style="color: #008000;"> headers 表格属性列名数组

    • <span style="color: #808080;">@param<span style="color: #008000;"> dataset 需要显示的数据集合,Double[]

    • <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中

    • <span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(String[] headers,OutputStream out,String pattern) {
      <span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
      HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
      <span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
      HSSFSheet sheet =<span style="color: #000000;"> workbook.createSheet();

      write2Sheet(sheet,headers,pattern);
      <span style="color: #0000ff;">try<span style="color: #000000;"> {
      workbook.write(out);
      } <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
      LG.error(e.toString(),e);
      }
      }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> exportExcel(String[][] datalist,OutputStream out) {
    <span style="color: #0000ff;">try<span style="color: #000000;"> {
    <span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
    HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
    <span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
    HSSFSheet sheet =<span style="color: #000000;"> workbook.createSheet();

         </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0; i < datalist.length; i++<span style="color: #000000;"&gt;) {
             String[] r </span>=<span style="color: #000000;"&gt; datalist[i];
             HSSFRow row </span>=<span style="color: #000000;"&gt; sheet.createRow(i);
             </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> j = 0; j < r.length; j++<span style="color: #000000;"&gt;) {
                 HSSFCell cell </span>=<span style="color: #000000;"&gt; row.createCell(j);
                 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;cell max length 32767</span>
                 <span style="color: #0000ff;"&gt;if</span> (r[j].length() > 32767<span style="color: #000000;"&gt;) {
                     r[j] </span>= "--此字段过长(超过32767),已被截断--" +<span style="color: #000000;"&gt; r[j];
                     r[j] </span>= r[j].substring(0,32766<span style="color: #000000;"&gt;);
                 }
                 cell.setCellValue(r[j]);
             }
         }
         </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;自动列宽</span>
         <span style="color: #0000ff;"&gt;if</span> (datalist.length > 0<span style="color: #000000;"&gt;) {
             </span><span style="color: #0000ff;"&gt;int</span> colcount = datalist[0<span style="color: #000000;"&gt;].length;
             </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0; i < colcount; i++<span style="color: #000000;"&gt;) {
                 sheet.autoSizeColumn(i);
             }
         }
         workbook.write(out);
     } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (IOException e) {
         LG.error(e.toString(),e);
     }

    }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
    • 用于多个sheet
    • <span style="color: #808080;">@param<span style="color: #008000;">
    • <span style="color: #808080;">@param<span style="color: #008000;"> sheets {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelSheet}的集合
    • <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(List<ExcelSheet><span style="color: #000000;"> sheets,OutputStream out) {
      exportExcel(sheets,<span style="color: #0000ff;">null<span style="color: #000000;">);
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
    • 用于多个sheet
    • <span style="color: #808080;">@param<span style="color: #008000;">
    • <span style="color: #808080;">@param<span style="color: #008000;"> sheets {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelSheet}的集合
    • <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
    • <span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(List<ExcelSheet><span style="color: #000000;"> sheets,String pattern) {
      <span style="color: #0000ff;">if<span style="color: #000000;"> (CollectionUtils.isEmpty(sheets)) {
      <span style="color: #0000ff;">return<span style="color: #000000;">;
      }
      <span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
      HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
      <span style="color: #0000ff;">for (ExcelSheet<span style="color: #000000;"> sheet : sheets) {
      <span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
      HSSFSheet hssfSheet =<span style="color: #000000;"> workbook.createSheet(sheet.getSheetName());
      write2Sheet(hssfSheet,sheet.getHeaders(),sheet.getDataset(),pattern);
      }
      <span style="color: #0000ff;">try<span style="color: #000000;"> {
      workbook.write(out);
      } <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
      LG.error(e.toString(),e);
      }
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 每个sheet的写入

    • <span style="color: #808080;">@param<span style="color: #008000;"> sheet 页签

    • <span style="color: #808080;">@param<span style="color: #008000;"> headers 表头

    • <span style="color: #808080;">@param<span style="color: #008000;"> dataset 数据集合

    • <span style="color: #808080;">@param<span style="color: #008000;"> pattern 日期格式
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">void write2Sheet(HSSFSheet sheet,String[] headers,String pattern) {
      <span style="color: #008000;">//<span style="color: #008000;"> 产生表格标题行
      HSSFRow row = sheet.createRow(0<span style="color: #000000;">);
      <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < headers.length; i++<span style="color: #000000;">) {
      HSSFCell cell =<span style="color: #000000;"> row.createCell(i);
      HSSFRichTextString text = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFRichTextString(headers[i]);
      cell.setCellValue(text);
      }

      <span style="color: #008000;">//<span style="color: #008000;"> 遍历集合数据,产生数据行
      Iterator it =<span style="color: #000000;"> dataset.iterator();
      <span style="color: #0000ff;">int index = 0<span style="color: #000000;">;
      <span style="color: #0000ff;">while<span style="color: #000000;"> (it.hasNext()) {
      index++<span style="color: #000000;">;
      row =<span style="color: #000000;"> sheet.createRow(index);
      T t =<span style="color: #000000;"> (T) it.next();
      <span style="color: #0000ff;">try<span style="color: #000000;"> {
      <span style="color: #0000ff;">if (t <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Map) {
      @SuppressWarnings("unchecked"<span style="color: #000000;">)
      Map<String,Object> map = (Map<String,Object><span style="color: #000000;">) t;
      <span style="color: #0000ff;">int cellNum = 0<span style="color: #000000;">;
      <span style="color: #0000ff;">for<span style="color: #000000;"> (String k : headers) {
      <span style="color: #0000ff;">if (map.containsKey(k) == <span style="color: #0000ff;">false<span style="color: #000000;">) {
      LG.error("Map 中 不存在 key [" + k + "]"<span style="color: #000000;">);
      <span style="color: #0000ff;">continue<span style="color: #000000;">;
      }
      Object value =<span style="color: #000000;"> map.get(k);
      HSSFCell cell =<span style="color: #000000;"> row.createCell(cellNum);
      cell.setCellValue(String.valueOf(value));
      cellNum++<span style="color: #000000;">;
      }
      } <span style="color: #0000ff;">else<span style="color: #000000;"> {
      List fields =<span style="color: #000000;"> sortFieldByAnno(t.getClass());
      <span style="color: #0000ff;">int cellNum = 0<span style="color: #000000;">;
      <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < fields.size(); i++<span style="color: #000000;">) {
      HSSFCell cell =<span style="color: #000000;"> row.createCell(cellNum);
      Field field =<span style="color: #000000;"> fields.get(i).getField();
      field.setAccessible(<span style="color: #0000ff;">true<span style="color: #000000;">);
      Object value =<span style="color: #000000;"> field.get(t);
      String textValue = <span style="color: #0000ff;">null<span style="color: #000000;">;
      <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Integer) {
      <span style="color: #0000ff;">int intValue =<span style="color: #000000;"> (Integer) value;
      cell.setCellValue(intValue);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Float) {
      <span style="color: #0000ff;">float fValue =<span style="color: #000000;"> (Float) value;
      cell.setCellValue(fValue);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Double) {
      <span style="color: #0000ff;">double dValue =<span style="color: #000000;"> (Double) value;
      cell.setCellValue(dValue);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Long) {
      <span style="color: #0000ff;">long longValue =<span style="color: #000000;"> (Long) value;
      cell.setCellValue(longValue);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Boolean) {
      <span style="color: #0000ff;">boolean bValue =<span style="color: #000000;"> (Boolean) value;
      cell.setCellValue(bValue);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Date) {
      Date date =<span style="color: #000000;"> (Date) value;
      SimpleDateFormat sdf = <span style="color: #0000ff;">new<span style="color: #000000;"> SimpleDateFormat(pattern);
      textValue =<span style="color: #000000;"> sdf.format(date);
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> String[]) {
      String[] strArr =<span style="color: #000000;"> (String[]) value;
      <span style="color: #0000ff;">for (<span style="color: #0000ff;">int j = 0; j < strArr.length; j++<span style="color: #000000;">) {
      String str =<span style="color: #000000;"> strArr[j];
      cell.setCellValue(str);
      <span style="color: #0000ff;">if (j != strArr.length - 1<span style="color: #000000;">) {
      cellNum++<span style="color: #000000;">;
      cell =<span style="color: #000000;"> row.createCell(cellNum);
      }
      }
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Double[]) {
      Double[] douArr =<span style="color: #000000;"> (Double[]) value;
      <span style="color: #0000ff;">for (<span style="color: #0000ff;">int j = 0; j < douArr.length; j++<span style="color: #000000;">) {
      Double val =<span style="color: #000000;"> douArr[j];
      <span style="color: #008000;">//<span style="color: #008000;"> 资料不为空则set Value
      <span style="color: #0000ff;">if (val != <span style="color: #0000ff;">null<span style="color: #000000;">) {
      cell.setCellValue(val);
      }

                           </span><span style="color: #0000ff;"&gt;if</span> (j != douArr.length - 1<span style="color: #000000;"&gt;) {
                               cellNum</span>++<span style="color: #000000;"&gt;;
                               cell </span>=<span style="color: #000000;"&gt; row.createCell(cellNum);
                           }
                       }
                   } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
                       </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 其它数据类型都当作字符串简单处理</span>
                       String empty =<span style="color: #000000;"&gt; StringUtils.EMPTY;
                       ExcelCell anno </span>= field.getAnnotation(ExcelCell.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
                       </span><span style="color: #0000ff;"&gt;if</span> (anno != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
                           empty </span>=<span style="color: #000000;"&gt; anno.defaultValue();
                       }
                       textValue </span>= value == <span style="color: #0000ff;"&gt;null</span> ?<span style="color: #000000;"&gt; empty : value.toString();
                   }
                   </span><span style="color: #0000ff;"&gt;if</span> (textValue != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
                       HSSFRichTextString richString </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; HSSFRichTextString(textValue);
                       cell.setCellValue(richString);
                   }
      
                   cellNum</span>++<span style="color: #000000;"&gt;;
               }
           }
       } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
           LG.error(e.toString(),e);
       }

      }
      <span style="color: #008000;">//<span style="color: #008000;"> 设定自动宽度
      <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < headers.length; i++<span style="color: #000000;">) {
      sheet.autoSizeColumn(i);
      }
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 把Excel的数据封装成voList

    • <span style="color: #808080;">@param<span style="color: #008000;"> clazz vo的Class

    • <span style="color: #808080;">@param<span style="color: #008000;"> inputStream excel输入流

    • <span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输入格式。默认为"yyy-MM-dd"

    • <span style="color: #808080;">@param<span style="color: #008000;"> logs 错误log集合

    • <span style="color: #808080;">@param<span style="color: #008000;"> arrayCount 如果vo中有数组类型,那就按照index顺序,把数组应该有几个值写上.

    • <span style="color: #808080;">@return<span style="color: #008000;"> voList

    • <span style="color: #808080;">@throws<span style="color: #008000;"> RuntimeException
      <span style="color: #008000;">*/<span style="color: #000000;">
      @SuppressWarnings("unchecked"<span style="color: #000000;">)
      <span style="color: #0000ff;">public <span style="color: #0000ff;">static Collection importExcel(Class<span style="color: #000000;"> clazz,InputStream inputStream,String pattern,ExcelLogs logs,Integer... arrayCount) {
      HSSFWorkbook workBook = <span style="color: #0000ff;">null<span style="color: #000000;">;
      <span style="color: #0000ff;">try<span style="color: #000000;"> {
      workBook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook(inputStream);
      } <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
      LG.error(e.toString(),e);
      }
      List list = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
      HSSFSheet sheet = workBook.getSheetAt(0<span style="color: #000000;">);
      Iterator rowIterator =<span style="color: #000000;"> sheet.rowIterator();
      <span style="color: #0000ff;">try<span style="color: #000000;"> {
      List logList = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
      <span style="color: #008000;">//<span style="color: #008000;"> Map<title,index>
      Map<String,Integer> titleMap = <span style="color: #0000ff;">new HashMap<><span style="color: #000000;">();

       </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt; (rowIterator.hasNext()) {
           Row row </span>=<span style="color: #000000;"&gt; rowIterator.next();
           </span><span style="color: #0000ff;"&gt;if</span> (row.getRowNum() == 0<span style="color: #000000;"&gt;) {
               </span><span style="color: #0000ff;"&gt;if</span> (clazz == Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;) {
                   </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 解析map用的key,就是excel标题行</span>
                   Iterator<Cell> cellIterator =<span style="color: #000000;"&gt; row.cellIterator();
                   Integer index </span>= 0<span style="color: #000000;"&gt;;
                   </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt; (cellIterator.hasNext()) {
                       String value </span>=<span style="color: #000000;"&gt; cellIterator.next().getStringCellValue();
                       titleMap.put(value,index);
                       index</span>++<span style="color: #000000;"&gt;;
                   }
               }
               </span><span style="color: #0000ff;"&gt;continue</span><span style="color: #000000;"&gt;;
           }
           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 整行都空,就跳过</span>
           <span style="color: #0000ff;"&gt;boolean</span> allRowIsNull = <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
           Iterator</span><Cell> cellIterator =<span style="color: #000000;"&gt; row.cellIterator();
           </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt; (cellIterator.hasNext()) {
               Object cellValue </span>=<span style="color: #000000;"&gt; getCellValue(cellIterator.next());
               </span><span style="color: #0000ff;"&gt;if</span> (cellValue != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
                   allRowIsNull </span>= <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
                   </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;;
               }
           }
           </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (allRowIsNull) {
               LG.warn(</span>"Excel row " + row.getRowNum() + " all row value is null!"<span style="color: #000000;"&gt;);
               </span><span style="color: #0000ff;"&gt;continue</span><span style="color: #000000;"&gt;;
           }
           T t </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
           StringBuilder log </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StringBuilder();
           </span><span style="color: #0000ff;"&gt;if</span> (clazz == Map.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;) {
               Map</span><String,Object> map = <span style="color: #0000ff;"&gt;new</span> HashMap<String,Object><span style="color: #000000;"&gt;();
               </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String k : titleMap.keySet()) {
                   Integer index </span>=<span style="color: #000000;"&gt; titleMap.get(k);
                   String value </span>=<span style="color: #000000;"&gt; row.getCell(index).getStringCellValue();
                   map.put(k,value);
               }
               list.add((T) map);
      
           } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
               t </span>=<span style="color: #000000;"&gt; clazz.newInstance();
               </span><span style="color: #0000ff;"&gt;int</span> arrayIndex = 0;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 标识当前第几个数组了</span>
               <span style="color: #0000ff;"&gt;int</span> cellIndex = 0;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 标识当前读到这一行的第几个cell了</span>
               List<FieldForSortting> fields =<span style="color: #000000;"&gt; sortFieldByAnno(clazz);
               </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (FieldForSortting ffs : fields) {
                   Field field </span>=<span style="color: #000000;"&gt; ffs.getField();
                   field.setAccessible(</span><span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;);
                   </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (field.getType().isArray()) {
                       Integer count </span>=<span style="color: #000000;"&gt; arrayCount[arrayIndex];
                       Object[] value </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
                       </span><span style="color: #0000ff;"&gt;if</span> (field.getType().equals(String[].<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;)) {
                           value </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; String[count];
                       } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
                           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 目前只支持String[]和Double[]</span>
                           value = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Double[count];
                       }
                       </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0; i < count; i++<span style="color: #000000;"&gt;) {
                           Cell cell </span>=<span style="color: #000000;"&gt; row.getCell(cellIndex);
                           String errMsg </span>=<span style="color: #000000;"&gt; validateCell(cell,field,cellIndex);
                           </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (StringUtils.isBlank(errMsg)) {
                               value[i] </span>=<span style="color: #000000;"&gt; getCellValue(cell);
                           } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
                               log.append(errMsg);
                               log.append(</span>";"<span style="color: #000000;"&gt;);
                               logs.setHasError(</span><span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;);
                           }
                           cellIndex</span>++<span style="color: #000000;"&gt;;
                       }
                       field.set(t,value);
                       arrayIndex</span>++<span style="color: #000000;"&gt;;
                   } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
                       Cell cell </span>=<span style="color: #000000;"&gt; row.getCell(cellIndex);
                       String errMsg </span>=<span style="color: #000000;"&gt; validateCell(cell,cellIndex);
                       </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (StringUtils.isBlank(errMsg)) {
                           Object value </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
                           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 处理特殊情况,Excel中的String,转换成Bean的Date</span>
                           <span style="color: #0000ff;"&gt;if</span> (field.getType().equals(Date.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;)
                                   </span>&amp;&amp; cell.getCellType() ==<span style="color: #000000;"&gt; Cell.CELL_TYPE_STRING) {
                               Object strDate </span>=<span style="color: #000000;"&gt; getCellValue(cell);
                               </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
                                   value </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; SimpleDateFormat(pattern).parse(strDate.toString());
                               } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (ParseException e) {
      
                                   errMsg </span>=<span style="color: #000000;"&gt;
                                           MessageFormat.format(</span>"the cell [{0}] can not be converted to a date "<span style="color: #000000;"&gt;,CellReference.convertNumToColString(cell.getColumnIndex()));
                               }
                           } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
                               value </span>=<span style="color: #000000;"&gt; getCellValue(cell);
                               </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 处理特殊情况,excel的value为String,且bean中为其他,且defaultValue不为空,那就=defaultValue</span>
                               ExcelCell annoCell = field.getAnnotation(ExcelCell.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;);
                               </span><span style="color: #0000ff;"&gt;if</span> (value <span style="color: #0000ff;"&gt;instanceof</span> String &amp;&amp; !field.getType().equals(String.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;)
                                       </span>&amp;&amp;<span style="color: #000000;"&gt; StringUtils.isNotBlank(annoCell.defaultValue())) {
                                   value </span>=<span style="color: #000000;"&gt; annoCell.defaultValue();
                               }
                           }
                           field.set(t,value);
                       }
                       </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (StringUtils.isNotBlank(errMsg)) {
                           log.append(errMsg);
                           log.append(</span>";"<span style="color: #000000;"&gt;);
                           logs.setHasError(</span><span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;);
                       }
                       cellIndex</span>++<span style="color: #000000;"&gt;;
                   }
               }
               list.add(t);
               logList.add(</span><span style="color: #0000ff;"&gt;new</span> ExcelLog(t,log.toString(),row.getRowNum() + 1<span style="color: #000000;"&gt;));
           }
       }
       logs.setLogList(logList);

      } <span style="color: #0000ff;">catch<span style="color: #000000;"> (InstantiationException e) {
      <span style="color: #0000ff;">throw <span style="color: #0000ff;">new RuntimeException(MessageFormat.format("can not instance class:{0}"<span style="color: #000000;">,clazz.getSimpleName()),e);
      } <span style="color: #0000ff;">catch<span style="color: #000000;"> (IllegalAccessException e) {
      <span style="color: #0000ff;">throw <span style="color: #0000ff;">new RuntimeException(MessageFormat.format("can not instance class:{0}"<span style="color: #000000;">,e);
      }
      <span style="color: #0000ff;">return<span style="color: #000000;"> list;
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 驗證Cell類型是否正確

    • <span style="color: #808080;">@param<span style="color: #008000;"> cell cell單元格

    • <span style="color: #808080;">@param<span style="color: #008000;"> field 欄位

    • <span style="color: #808080;">@param<span style="color: #008000;"> cellNum 第幾個欄位,用於errMsg

    • <span style="color: #808080;">@return
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static String validateCell(Cell cell,Field field,<span style="color: #0000ff;">int<span style="color: #000000;"> cellNum) {
      String columnName =<span style="color: #000000;"> CellReference.convertNumToColString(cellNum);
      String result = <span style="color: #0000ff;">null<span style="color: #000000;">;
      Integer[] integers =<span style="color: #000000;"> validateMap.get(field.getType());
      <span style="color: #0000ff;">if (integers == <span style="color: #0000ff;">null<span style="color: #000000;">) {
      result = MessageFormat.format("Unsupported type [{0}]"<span style="color: #000000;">,field.getType().getSimpleName());
      <span style="color: #0000ff;">return<span style="color: #000000;"> result;
      }
      ExcelCell annoCell = field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class<span style="color: #000000;">);
      <span style="color: #0000ff;">if (cell == <span style="color: #0000ff;">null
      || (cell.getCellType() == Cell.CELL_TYPE_STRING &&<span style="color: #000000;"> StringUtils.isBlank(cell
      .getStringCellValue()))) {
      <span style="color: #0000ff;">if (annoCell != <span style="color: #0000ff;">null && annoCell.valid().allowNull() == <span style="color: #0000ff;">false<span style="color: #000000;">) {
      result = MessageFormat.format("the cell [{0}] can not null"<span style="color: #000000;">,columnName);
      }
      ;
      } <span style="color: #0000ff;">else <span style="color: #0000ff;">if (cell.getCellType() == Cell.CELL_TYPE_BLANK &&<span style="color: #000000;"> annoCell.valid().allowNull()) {
      <span style="color: #0000ff;">return<span style="color: #000000;"> result;
      } <span style="color: #0000ff;">else<span style="color: #000000;"> {
      List cellTypes =<span style="color: #000000;"> Arrays.asList(integers);

       </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 如果類型不在指定範圍內,並且沒有默認值</span>
       <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;(cellTypes.contains(cell.getCellType()))
               </span>||<span style="color: #000000;"&gt; StringUtils.isNotBlank(annoCell.defaultValue())
               </span>&amp;&amp; cell.getCellType() ==<span style="color: #000000;"&gt; Cell.CELL_TYPE_STRING) {
           StringBuilder strType </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StringBuilder();
           </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0; i < cellTypes.size(); i++<span style="color: #000000;"&gt;) {
               Integer intType </span>=<span style="color: #000000;"&gt; cellTypes.get(i);
               strType.append(getCellTypeByInt(intType));
               </span><span style="color: #0000ff;"&gt;if</span> (i != cellTypes.size() - 1<span style="color: #000000;"&gt;) {
                   strType.append(</span>","<span style="color: #000000;"&gt;);
               }
           }
           result </span>=<span style="color: #000000;"&gt;
                   MessageFormat.format(</span>"the cell [{0}] type must [{1}]"<span style="color: #000000;"&gt;,columnName,strType.toString());
       } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 类型符合验证,但值不在要求范围内的
           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; String in</span>
           <span style="color: #0000ff;"&gt;if</span> (annoCell.valid().in().length != 0 &amp;&amp; cell.getCellType() ==<span style="color: #000000;"&gt; Cell.CELL_TYPE_STRING) {
               String[] in </span>=<span style="color: #000000;"&gt; annoCell.valid().in();
               String cellValue </span>=<span style="color: #000000;"&gt; cell.getStringCellValue();
               </span><span style="color: #0000ff;"&gt;boolean</span> isIn = <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
               </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String str : in) {
                   </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (str.equals(cellValue)) {
                       isIn </span>= <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
                   }
               }
               </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;isIn) {
                   result </span>= MessageFormat.format("the cell [{0}] value must in {1}"<span style="color: #000000;"&gt;,in);
               }
           }
           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 数字型</span>
           <span style="color: #0000ff;"&gt;if</span> (cell.getCellType() ==<span style="color: #000000;"&gt; Cell.CELL_TYPE_NUMERIC) {
               </span><span style="color: #0000ff;"&gt;double</span> cellValue =<span style="color: #000000;"&gt; cell.getNumericCellValue();
               </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 小于</span>
               <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;Double.isNaN(annoCell.valid().lt())) {
                   </span><span style="color: #0000ff;"&gt;if</span> (!(cellValue <<span style="color: #000000;"&gt; annoCell.valid().lt())) {
                       result </span>=<span style="color: #000000;"&gt;
                               MessageFormat.format(</span>"the cell [{0}] value must less than [{1}]"<span style="color: #000000;"&gt;,annoCell.valid().lt());
                   }
               }
               </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 大于</span>
               <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;Double.isNaN(annoCell.valid().gt())) {
                   </span><span style="color: #0000ff;"&gt;if</span> (!(cellValue ><span style="color: #000000;"&gt; annoCell.valid().gt())) {
                       result </span>=<span style="color: #000000;"&gt;
                               MessageFormat.format(</span>"the cell [{0}] value must greater than [{1}]"<span style="color: #000000;"&gt;,annoCell.valid().gt());
                   }
               }
               </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 小于等于</span>
               <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;Double.isNaN(annoCell.valid().le())) {
                   </span><span style="color: #0000ff;"&gt;if</span> (!(cellValue <=<span style="color: #000000;"&gt; annoCell.valid().le())) {
                       result </span>=<span style="color: #000000;"&gt;
                               MessageFormat.format(</span>"the cell [{0}] value must less than or equal [{1}]"<span style="color: #000000;"&gt;,annoCell.valid().le());
                   }
               }
               </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 大于等于</span>
               <span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;Double.isNaN(annoCell.valid().ge())) {
                   </span><span style="color: #0000ff;"&gt;if</span> (!(cellValue >=<span style="color: #000000;"&gt; annoCell.valid().ge())) {
                       result </span>=<span style="color: #000000;"&gt;
                               MessageFormat.format(</span>"the cell [{0}] value must greater than or equal [{1}]"<span style="color: #000000;"&gt;,annoCell.valid().ge());
                   }
               }
           }
       }

      }
      <span style="color: #0000ff;">return<span style="color: #000000;"> result;
      }

    <span style="color: #008000;">/**<span style="color: #008000;">

    • 根据annotation的seq排序后的栏位
    • <span style="color: #808080;">@param<span style="color: #008000;"> clazz
    • <span style="color: #808080;">@return
      <span style="color: #008000;">*/
      <span style="color: #0000ff;">private <span style="color: #0000ff;">static List sortFieldByAnno(Class<?><span style="color: #000000;"> clazz) {
      Field[] fieldsArr =<span style="color: #000000;"> clazz.getDeclaredFields();
      List fields = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
      List annoNullFields = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
      <span style="color: #0000ff;">for<span style="color: #000000;"> (Field field : fieldsArr) {
      ExcelCell ec = field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class<span style="color: #000000;">);
      <span style="color: #0000ff;">if (ec == <span style="color: #0000ff;">null<span style="color: #000000;">) {
      <span style="color: #008000;">//<span style="color: #008000;"> 没有ExcelCell Annotation 视为不汇入
      <span style="color: #0000ff;">continue<span style="color: #000000;">;
      }
      <span style="color: #0000ff;">int id =<span style="color: #000000;"> ec.index();
      fields.add(<span style="color: #0000ff;">new<span style="color: #000000;"> FieldForSortting(field,id));
      }
      fields.addAll(annoNullFields);
      sortByProperties(fields,<span style="color: #0000ff;">true,<span style="color: #0000ff;">false,"index"<span style="color: #000000;">);
      <span style="color: #0000ff;">return<span style="color: #000000;"> fields;
      }

    @SuppressWarnings("unchecked"<span style="color: #000000;">)
    <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">void sortByProperties(List<? <span style="color: #0000ff;">extends Object> list,<span style="color: #0000ff;">boolean<span style="color: #000000;"> isNullHigh,<span style="color: #0000ff;">boolean<span style="color: #000000;"> isReversed,String... props) {
    <span style="color: #0000ff;">if<span style="color: #000000;"> (CollectionUtils.isNotEmpty(list)) {
    Comparator<?> typeComp =<span style="color: #000000;"> ComparableComparator.getInstance();
    <span style="color: #0000ff;">if (isNullHigh == <span style="color: #0000ff;">true<span style="color: #000000;">) {
    typeComp =<span style="color: #000000;"> ComparatorUtils.nullHighComparator(typeComp);
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    typeComp =<span style="color: #000000;"> ComparatorUtils.nullLowComparator(typeComp);
    }
    <span style="color: #0000ff;">if<span style="color: #000000;"> (isReversed) {
    typeComp =<span style="color: #000000;"> ComparatorUtils.reversedComparator(typeComp);
    }

         List</span><Object> sortCols = <span style="color: #0000ff;"&gt;new</span> ArrayList<Object><span style="color: #000000;"&gt;();
    
         </span><span style="color: #0000ff;"&gt;if</span> (props != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
             </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String prop : props) {
                 sortCols.add(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; BeanComparator(prop,typeComp));
             }
         }
         </span><span style="color: #0000ff;"&gt;if</span> (sortCols.size() > 0<span style="color: #000000;"&gt;) {
             Comparator</span><Object> sortChain = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ComparatorChain(sortCols);
             Collections.sort(list,sortChain);
         }
     }

    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读