色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

java多線程導入excel的方法

瀏覽:107日期:2022-05-22 10:35:05
一、首先是依賴

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency>二、導入實現類

package com.supcon.mare.tankinfo.util;import com.alibaba.excel.util.StringUtils;import com.supcon.mare.common.util.exception.InterfaceException;import com.supcon.mare.tankinfo.constant.Constants;import com.supcon.mare.tankinfo.entity.TankAreaEntity;import com.supcon.mare.tankinfo.entity.TankMovementEntity;import com.supcon.mare.tankinfo.repository.TankAreaRepository;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.Sheet;import java.util.*;import java.util.stream.Collectors;/** * @author: zhaoxu * @description: */public class ExcelThreadUtil implements Runnable { Sheet sheet; Integer rowIndex; List<String> rowNames; Integer size = 0; TankAreaRepository tankAreaRepository; ReflectUtil reflectUtil; public volatile static List<TankMovementEntity> tankMovementEntities = new ArrayList<>(); public void setExcelThreadAttr(Sheet sheet, Integer rowIndex, List<String> rowNames, Integer size, TankAreaRepository tankAreaRepository, ReflectUtil reflectUtil) {this.sheet = sheet;this.rowIndex = rowIndex;this.rowNames = rowNames;this.size = size;this.tankAreaRepository = tankAreaRepository;this.reflectUtil = reflectUtil; } @Override public void run() {int index = 0;while (sheet.getRow(rowIndex) != null && index < size) { TankMovementEntity tankMovementEntity = new TankMovementEntity(); Integer cellIndex = 0; List<String> units = new ArrayList(); Iterator<Cell> cellIterator = sheet.getRow(rowIndex).cellIterator(); while (cellIterator.hasNext()) {Cell cell = cellIterator.next();cell.setCellType(CellType.STRING);String rowName = rowNames.get(cellIndex++);try { //解析標題 judgeToParse(tankMovementEntity, rowName, cell, units, sheet);} catch (Exception e) { throw new InterfaceException(3414, '第' + (cell.getRowIndex() + 1) + '行,' + (cell.getColumnIndex() + 1) + '列發生錯誤:' + cell.toString());} } Boolean hasValue = false; try {Map<String, Object> fieldsValue = reflectUtil.getFieldsValue(TankMovementEntity.class, tankMovementEntity);Iterator<String> fieldKey = fieldsValue.keySet().iterator();//如果所有屬性為空則不導入while (fieldKey.hasNext()) { String key = fieldKey.next(); Object value = fieldsValue.get(key); if (!'serialVersionUID'.equals(key) && !StringUtils.isEmpty(fieldsValue.get(key))) {hasValue = true;break; }}tankMovementEntity.setValid(1); } catch (IllegalAccessException e) {e.printStackTrace(); } rowIndex++; index++; if (!hasValue) {continue; } tankMovementEntity.setGmtCreate(Utils.getNowDate()); tankMovementEntity.setSupportAddPump(0); tankMovementEntity.setSupportDelPump(0); tankMovementEntity.setChangeTank(0); tankMovementEntity.setSupportUpdatePump(0); //解析單元號 if (units.size() > 1) {units.stream().forEach(unit -> { TankAreaEntity tankAreaEntity = tankAreaRepository.findByTankAreaCodeAndValid(unit, Constants.VALID_TRUE); if (tankAreaEntity == null && tankMovementEntity.getTankArea() == null) {tankAreaEntity = new TankAreaEntity();tankAreaEntity.setId(Long.valueOf(1));tankMovementEntity.setTankArea(tankAreaEntity); } List<String> unContainUnit = units.stream().filter(unit1 -> !unit1.equals(unit)).collect(Collectors.toList()); StringBuilder goalTankArea = new StringBuilder(); unContainUnit.stream().forEach(un -> goalTankArea.append(un + ',')); tankMovementEntity.setGoalTankArea(goalTankArea.substring(0, goalTankArea.lastIndexOf(','))); tankMovementEntity.setStrideTankarea(1);}); } else {TankAreaEntity tankAreaEntity = null;if (units.size() > 0) { tankAreaEntity = tankAreaRepository.findByTankAreaCodeAndValid(units.get(0), Constants.VALID_TRUE);}if (tankAreaEntity == null && tankMovementEntity.getTankArea() == null) { tankAreaEntity = new TankAreaEntity(); tankAreaEntity.setId(Long.valueOf(1));}tankMovementEntity.setTankArea(tankAreaEntity); } if (!StringUtils.isEmpty(tankMovementEntity.getGoalTankArea())) {tankMovementEntity.setStrideTankarea(1); } else {tankMovementEntity.setStrideTankarea(0); } synchronized (tankMovementEntities) {tankMovementEntities.add(tankMovementEntity); }} } public void judgeToParse(TankMovementEntity tankMovementEntity, String rowName, Cell cell, List<String> units, Sheet sheet) {String stringCellValue;if (Utils.isMergedRegion(sheet, cell.getRowIndex(), cell.getColumnIndex())) { stringCellValue = Utils.getMergedRegionValue(sheet, cell.getRowIndex(), cell.getColumnIndex()).replaceAll('n', ',');} else { stringCellValue = cell.getStringCellValue().replaceAll('n', ',');}if (StringUtils.isEmpty(stringCellValue)) { return;}//判斷是否需要進行轉換if (Constants.CONTINUITY.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 0);} else if (Constants.BATCH.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 1);} else if (Constants.YES.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 1);} else if (Constants.NO.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 0);} else if (Constants.PROVIDE.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 1);} else if (Constants.UN_PROVIDE.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, 0);} else if (Constants.NA.equals(stringCellValue)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, null);} else if (Constants.SOURCE_DEVICE.equals(rowName) || Constants.PUMP_DEVICE.equals(rowName) || Constants.GOAL_DEVICE.equals(rowName) || Constants.VALVE_DEVICE.equals(rowName)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, stringCellValue);} else if ((Constants.TANK_AREA).equals(rowName)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, tankAreaRepository.findByTankAreaCodeAndValid(stringCellValue, Constants.VALID_TRUE));} else if ((Constants.SWITCH_TANK_SOURCE).equals(rowName)) { reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, '目的'.equals(stringCellValue) ? 1 : 0);} else if ((Constants.UNIT).equals(rowName)) { if (stringCellValue.contains(Constants.COMMA)) {String[] split = stringCellValue.split(',');units.addAll(Arrays.asList(split)); } else {units.add(stringCellValue); }} else { Class<?> aClass = null; try {//反射獲取字段類型String typeName = TankMovementEntity.class.getDeclaredField(rowName).getGenericType().getTypeName();aClass = Class.forName(typeName); } catch (Exception e) {System.out.println(('未找到屬性類型:' + rowName)); } if (aClass == Long.class) {reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, Long.valueOf(stringCellValue)); } else if (aClass == Integer.class || aClass == int.class) {if (Integer.valueOf(stringCellValue) > 1 && !rowName.equals(Constants.MAX_PUMP)) { throw new ClassCastException('解析錯誤');}reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, Integer.valueOf(stringCellValue)); } else {reflectUtil.setValue(TankMovementEntity.class, tankMovementEntity, rowName, stringCellValue); }} }}三、調用多線程

@Override@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)public String importFromExcel(String fileString) throws IOException { Workbook workbook = null; File file = new File('D:Google下載' + fileString + '.xlsx'); InputStream is = new FileInputStream(file); if (file.getName().endsWith(Constants.XLSX)) {workbook = new XSSFWorkbook(is); } else if (file.getName().endsWith(Constants.XLS)) {workbook = new HSSFWorkbook(is); } Iterator<Sheet> sheetIterator = workbook.sheetIterator(); List<String> rowNames = new ArrayList<>(); while (sheetIterator.hasNext()) {Sheet sheet = sheetIterator.next();Iterator<Row> rowIterator = sheet.rowIterator();Integer rowIndex = 0;ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor((sheet.getLastRowNum() / readNumbers) + 1, (sheet.getLastRowNum() / readNumbers) + 2, 1000, TimeUnit.MILLISECONDS, new PriorityBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());while (rowIterator.hasNext()) { Row row = rowIterator.next(); //從第二行開始 if (rowIndex > 0) {Iterator<Cell> cellIterator = row.cellIterator();//第二行是標題if (rowIndex == 1) { //列遍歷 while (cellIterator.hasNext()) {Cell next = cellIterator.next();next.setCellType(CellType.STRING);String stringCellValue = next.getStringCellValue();rowNames.add(stringCellValue.replaceAll('n', '')); }} else { Cell cell = row.getCell(0); cell.setCellType(CellType.STRING); if (StringUtils.isEmpty(cell.getStringCellValue())) {break; } if ((rowIndex - 2) % readNumbers == 0) {ExcelThreadUtil excelThreadUtil = new ExcelThreadUtil();if ((sheet.getLastRowNum() - rowIndex + 1 < readNumbers * 2 && sheet.getLastRowNum() - rowIndex + 1 > readNumbers)) { Integer size = sheet.getLastRowNum() - rowIndex + 1; excelThreadUtil.setExcelThreadAttr(sheet, rowIndex, rowNames, size, tankAreaRepository, reflectUtil); Future<?> future = threadPoolExecutor.submit(excelThreadUtil); try {future.get(); } catch (Exception e) {ExcelThreadUtil.tankMovementEntities.clear();throw new InterfaceException(3414, e.getMessage()); } break;}excelThreadUtil.setExcelThreadAttr(sheet, rowIndex, rowNames, readNumbers, tankAreaRepository, reflectUtil);Future<?> future = threadPoolExecutor.submit(excelThreadUtil);try { future.get();} catch (Exception e) { ExcelThreadUtil.tankMovementEntities.clear(); throw new InterfaceException(3414, e.getMessage());} }} } rowIndex++;}threadStop(threadPoolExecutor); } return 'true';}

判斷線程是否都停止:

private void threadStop(ThreadPoolExecutor threadPoolExecutor) {while (true) { if (threadPoolExecutor.getActiveCount() == 0) {ExcelThreadUtil.tankMovementEntities.stream().forEach(tankMovement -> { tankMovement.setTaskDefineCode('move_' + String.valueOf((int) (Math.random() * (1600 - 1 + 1)) + 1) + System.currentTimeMillis()); String businessTypeName = tankMovement.getBusinessTypeCode(); EnumCodeEntity businessEnumEntity = enumCodeRepository.findByName(businessTypeName); tankMovement.setBusinessTypeCode(businessEnumEntity == null ? businessTypeName : businessEnumEntity.getTypeCode()); Integer random = (int) (Math.random() * (2 - 1 + 1)) + 1; tankMovement.setMaterialTypeCode(String.valueOf(random)); TankAreaEntity tankAreaEntity = new TankAreaEntity(); tankAreaEntity.setId(Long.valueOf((int) (Math.random() * (16 - 1 + 1)) + 1)); tankMovement.setTankArea(tankAreaEntity);});tankMovementRepository.saveAll(ExcelThreadUtil.tankMovementEntities);ExcelThreadUtil.tankMovementEntities.clear();break; }} }

到此這篇關于java多線程導入excel的方法的文章就介紹到這了,更多相關java多線程導入excel內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: excel
相關文章:
主站蜘蛛池模板: 亚洲欧美另类色妞网站 | 欧美成人一区二区三区 | 性做久久久久久久免费观看 | 国产孕妇孕交大片孕 | 国产一区私人高清影院 | 亚洲性免费 | 国产三级视频在线 | 无码精品一区二区三区免费视频 | 日本无玛 | 女人被男人躁得好爽免费视频免费 | 免费观看欧美精品成人毛片 | 久久精品高清 | 欧美另类视频在线 | 99爱在线视频这里只有精品 | 国产精品99久久久久久宅男 | 制服丝袜怡红院 | 99在线热视频 | 欧美精品色精品一区二区三区 | 美女张腿男人桶免费视频 | 男人天堂久久 | 亚洲欧美中文字幕在线网站 | 久久99久久精品国产99热 | 国产综合在线播放 | 免费特黄视频 | 国产1区2区三区不卡 | 亚洲黄色软件 | 成人久久久久久 | 国产性夜夜春夜夜爽30 | 直接在线观看的三级网址 | 小屁孩cao大人免费网站 | 99久在线精品99re6视频 | 国产三级视频网站 | 国产精品一区久久 | 香港a毛片免费全部播放 | 久久欧美精品 | 欧美日韩精品在线视频 | 精品免费久久久久久成人影院 | 日韩a级一片 | 奇米影视7777久久精品 | 美女被躁免费视频软件 | 国产成人精品免费视频网页大全 |