java多线程导入excel(poi)

让人想犯罪 __ 提交于 2020-01-12 11:36:04

导入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     }

 

 

 

 

结果

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!