• java多线程导入excel(poi)


    导入excel util

      1 /**
      2  * @Description: excel导入工具类
      3 
      4  * @Author: hg
      5 
      6  * @CreateDate: 2019/6/4 11:58
      7 
      8  */
      9 @SuppressWarnings("all")
     10 public class POIUtil<T> {
     11 
     12     private Logger logger = LoggerFactory.getLogger(this.getClass());
     13 
     14     private Workbook wb;
     15 
     16     private String[] property;
     17 
     18     private Class<T> c;
     19 
     20     private String filePath;
     21 
     22     private int startRow;
     23     
     24     private int startColumn;
     25 
     26     //是否需要hash
     27     private boolean isHash = false;
     28 
     29     //存放hash集合
     30     private HashSet<Integer> hashSet;
     31   
     32     private CopyOnWriteArrayList beanList;
     33 
     34     public CopyOnWriteArrayList getBeanList() {
     35         return beanList;
     36     }
     37 
     38     public POIUtil(String[] property, Class<T> c, String filePath, int startRow, int startColumn) {
     39         this.property = property;
     40         this.c = c;
     41         this.filePath = filePath;
     42         this.wb = getWorkbook(filePath);
     43         this.startRow = startRow;
     44         this.startColumn = startColumn;
     45         this.beanList = new CopyOnWriteArrayList();
     46     }
     47 
     48     /**
     49      * @Description:
     50      * @Param: [property 类的属性字符串数组, c class对下你给, filePath excel地址,
     51      * startRow 开始行, startColumn 开始列, hashSet 不需要必填,hash校验]
     52      * @return:
     53      * @Author: hg
     54      * @Date: 2019/6/4
     55      */
     56     public POIUtil(String[] property, Class<T> c, String filePath, int startRow, int startColumn, HashSet<Integer> hashSet) {
     57         this.property = property;
     58         this.c = c;
     59         this.filePath = filePath;
     60         this.wb = getWorkbook(filePath);
     61         this.startRow = startRow;
     62         this.startColumn = startColumn;
     63         this.hashSet = hashSet;
     64         this.isHash = true;
     65         this.beanList = new CopyOnWriteArrayList();
     66     }
     67 
     68     /**
     69      * @Description:
     70      * @Param: [startSheet sheet开始, endSheet sheet结束]
     71      * @return: void
     72      * @Author: hg
     73      * @Date: 2019/6/4
     74      */
     75     public void getBeanList(int startSheet, int endSheet) throws IllegalAccessException, InstantiationException, InvocationTargetException {
     76         HashMap<String, String> valueMap = new HashMap<>();
     77         for (int sheetNum = startSheet; sheetNum < endSheet; sheetNum++) {
     78             Sheet sheet = wb.getSheetAt(sheetNum);
     79             for (int rowNum = startRow; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {
     80                 Row row = sheet.getRow(rowNum);
     81                 for (int i = 0, columnNum = startColumn; i < property.length; i++, columnNum++) {
     82                     Cell cell = row.getCell(columnNum);
     83                     valueMap.put(property[i], getCellValue(cell, cell.getCellType()));
     84                 }
     85                 //这里使用clone效率更高
     86                 T t = c.newInstance();
     87                 BeanUtils.populate(t, valueMap);
     88 
     89                 //校验非空值
     90                 try {
     91                     ValidatorUtils.validateEntity(t);
     92                 } catch (WLHSEException e) {
     93                     continue;
     94                 }
     95 
     96                 //hash校验
     97                 if (isHash) {
     98                     synchronized (hashSet) {
     99                         if (hashSet.contains(t.hashCode()))
    100                             continue;
    101                         hashSet.add(t.hashCode());
    102                     }
    103                 }
    104                 beanList.add(t);
    105             }
    106         }
    107     }
    108 
    109     private Workbook getWorkbook(String filePath) {
    110         Workbook wb = null;
    111         try {
    112             if (null != filePath) {
    113                 FileInputStream fis = new FileInputStream(filePath);
    114                 if (filePath.endsWith(".xls")) {
    115                     wb = new HSSFWorkbook(fis);
    116                 } else if (filePath.endsWith(".xlsx")) {
    117                     wb = new XSSFWorkbook(fis);
    118                 }
    119                 return wb;
    120             }
    121         } catch (Exception e) {
    122             logger.error(e.getMessage(), e);
    123         }
    124         return null;
    125     }
    126 
    127     private String getCellValue(Cell rowCell, int rowCellType) {
    128         String value = "";
    129         switch (rowCellType) {
    130             case Cell.CELL_TYPE_STRING:
    131                 value = rowCell.getStringCellValue();
    132                 break;
    133             case Cell.CELL_TYPE_NUMERIC:
    134                 String dataFormat = rowCell.getCellStyle().getDataFormatString();
    135                 AtomicReference<Boolean> isDate = new AtomicReference<>(false);
    136                 if (DateUtil.isCellDateFormatted(rowCell)) {
    137                     value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
    138                 } else if (DateUtil.isCellInternalDateFormatted(rowCell)) {
    139                     value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
    140                 } else if (isDate.get()) {
    141                     value = new SimpleDateFormat("yyyy-MM-dd").format(rowCell.getDateCellValue());
    142                 } else if (dataFormat == null) {
    143                     value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
    144                 } else {
    145                     if (dataFormat != null) {
    146                         value = String.valueOf(rowCell.getNumericCellValue());
    147                     } else {
    148                         if (rowCell.getCellStyle().getDataFormatString().contains("$")) {
    149                             value = "$" + rowCell.getNumericCellValue();
    150                         } else if (rowCell.getCellStyle().getDataFormatString().contains("¥")) {
    151                             value = "¥" + rowCell.getNumericCellValue();
    152                         } else if (rowCell.getCellStyle().getDataFormatString().contains("¥")) {
    153                             value = "¥" + rowCell.getNumericCellValue();
    154                         } else if (rowCell.getCellStyle().getDataFormatString().contains("€")) {
    155                             value = "€" + String.valueOf(rowCell.getNumericCellValue());
    156                         } else {
    157                             value = String.valueOf(rowCell.getNumericCellValue());
    158                         }
    159                     }
    160                 }
    161                 break;
    162             case Cell.CELL_TYPE_BOOLEAN:
    163                 value = String.valueOf(rowCell.getBooleanCellValue());
    164                 break;
    165             case Cell.CELL_TYPE_ERROR:
    166                 value = ErrorEval.getText(rowCell.getErrorCellValue());
    167                 break;
    168             case Cell.CELL_TYPE_FORMULA:
    169                 value = rowCell.getCellFormula();
    170                 break;
    171         }
    172         return value;
    173     }
    174 
    175     public Workbook getWb() {
    176         return wb;
    177     }
    178 }

    导入excel线程

     1 public class POIThread implements Runnable {
     2     private int startSheet;
     3     private int endSheet;
     4     private POIUtil util;
     5     private CountDownLatch countDownLatch;
     6 
     7 
     8     POIThread(int startSheet, int endSheet, POIUtil util, CountDownLatch countDownLatch) {
     9         this.startSheet = startSheet;
    10         this.endSheet = endSheet;
    11         this.util = util;
    12         this.countDownLatch = countDownLatch;
    13     }
    14 
    15     @Override
    16     public void run() {
    17         try {
    18             util.getBeanList(startSheet, endSheet);
    19         } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
    20             e.printStackTrace();
    21         } finally {
    22             countDownLatch.countDown();
    23         }
    24     }
    25 }

    执行线程

     1 public class POIThreadHelper {
     2     public void work(POIUtil util) {
     3         //一个sheet分配一个线程
     4         int runSize = util.getWb().getNumberOfSheets();
     5 
     6         ExecutorService executor = Executors.newFixedThreadPool(runSize);
     7         CountDownLatch countDownLatch = new CountDownLatch(runSize);
     8 
     9         for (int i = 0; i < runSize; i++) {
    10             executor.execute(new POIThread(i, i + 1, util,countDownLatch));
    11         }
    12 
    13         try {
    14             countDownLatch.await();
    15         } catch (InterruptedException e) {
    16             e.printStackTrace();
    17         }
    18         executor.shutdown();
    19     }
    20 }

    测试

     1 @Test
     2     public void test1() throws IllegalAccessException, InvocationTargetException, InstantiationException {
     3         String path = "C:\logs\test.xls";
     4         String[] test = {"name", "sex"};
     5         POIUtil<Student> poiUtil = new POIUtil<Student>(test, Student.class, path, 1, 0);
     6         POIThreadHelper helper = new POIThreadHelper();
     7         helper.work(poiUtil);
     8         for (Object o : poiUtil.getBeanList()) {
     9             System.out.println(o.toString());
    10         }
    11     }

     

    结果

  • 相关阅读:
    在三层开发的DAL层中, 从web.config中读取数据库的连接字符串的方法
    [转]使用 DataAdapter 执行批量更新
    各式各样的 ICONS
    20个“标准的”配色方案
    一款 FORM 框报错提示 Demo
    超漂亮的仿腾讯弹出层效果
    POJ 2192 (DP)
    POJ 2063 (DP)
    POJ 3624 (DP)
    JavaScript技巧集
  • 原文地址:https://www.cnblogs.com/Gang-Bryant/p/10972818.html
Copyright © 2020-2023  润新知