java thread类 导入_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 {

11

12 private Logger logger = LoggerFactory.getLogger(this.getClass());

13

14 private Workbook wb;

15

16 private String[] property;

17

18 private Class 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 hashSet;

31

32 private CopyOnWriteArrayList beanList;

33

34 public CopyOnWriteArrayList getBeanList() {

35 return beanList;

36 }

37

38 public POIUtil(String[] property, Class 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 c, String filePath, int startRow, int startColumn, HashSet 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 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 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 poiUtil = new POIUtil(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 }

e4015499ab8367b539d97d944d0aa198.png

7f56f2e57760caf3cc25852c58a9c59e.png

结果

cc1be640851ffbcb8cd8d2ae3c22da59.png

标签:java,String,filePath,int,excel,value,rowCell,private,多线程

来源: https://www.cnblogs.com/Gang-Bryant/p/10972818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值