上传Excel文件数据到数据库使用多线程技术
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /** * 导入数据 先将文件上传到服务器,在开启线程进行执行插入 */ @RequestMapping (value = "/newUpload" , method = { RequestMethod.POST }) @Transactional public @ResponseBody JSONObject newUpload( @RequestParam (value = "file" , required = false ) MultipartFile file,HttpServletResponse response, HttpServletRequest request) { JSONObject json = new JSONObject(); String type = file.getOriginalFilename(); File filePath = null ; try { String filename = file.getOriginalFilename(); String uuid = UUID.randomUUID().toString(); filePath = new File( "C:/qzqdCompareDate" ); if (!filePath.exists()) { filePath.mkdir(); } String desPath = filePath + File.separator + uuid; File savefile = new File(desPath); file.transferTo(savefile); Compare compare= new Compare(); compare.setTaskName(filename); compare.setInsTime( new Date()); compare.setRecId(UuidOpt.getUuidAsString32()); compare.setStates( "0" ); //正在查询 compareService.mergeObject(compare); //生成任务 String recId=compare.getRecId(); //使用多线程技术,提高程序的效率 有一个客户端上传文件,就开启一个线程,完成文件的上传 new Thread( new Runnable() { // @SneakyThrows @Override public void run() { List<String[]> xlsList = FileUtil.getXlsList(desPath); //根据模板第二行隐藏字段取到对应匹配字段 String[] xlsTrFill = new String[ 2 ]; Compare compareDb=compareService.getObjectById(recId); if (xlsList.size()> 0 ){ for ( int i = 0 ; i < xlsList.size(); i++) { String[] xlsTr1 = (String[]) xlsList.get(i); if ( 0 ==i){ //获取姓名、性别、出生日期 continue ; } else { String baseCode=xlsTr1[ 0 ]; String itemName1=xlsTr1[ 1 ]; Map<String, Object> searchColumn= new HashMap<String, Object>(); searchColumn.put( "itemName" , itemName1); //查询数据库中的相似名称的权力事项数据 JSONArray jsonArrayObjects = compareService.queryAllItemByitemName( searchColumn, null ); if (jsonArrayObjects.size()> 0 ){ for ( int k= 0 ;k<jsonArrayObjects.size();k++){ CompareInfo compareInfo= new CompareInfo(); compareInfo.setRecId(UuidOpt.getUuidAsString32()); compareInfo.setTaskId(compareDb.getRecId()); compareInfo.setItemName1(itemName1); //Excel导入的事项名称 compareInfo.setItemName2(String.valueOf(jsonArrayObjects.getJSONObject(k).get( "itemName" ))); ///数据库中查询出来的事项名称 compareInfo.setBaseCode(String.valueOf(jsonArrayObjects.getJSONObject(k).get( "baseCode" ))); compareInfoService.mergeObject(compareInfo); } } else { //如果没有查询到数据,则把当前这个事项导入到数据库中 CompareInfo compareInfo= new CompareInfo(); compareInfo.setRecId(UuidOpt.getUuidAsString32()); compareInfo.setTaskId(compareDb.getRecId()); compareInfo.setItemName1(itemName1); //Excel导入的事项名称 compareInfoService.mergeObject(compareInfo); } } } compareDb.setEndTime( new Date()); compareDb.setStates( "1" ); compareService.mergeObject(compareDb); //生成任务 } else { json.put( "msg" , "导入失败!" ); json.put( "code" , "500" ); } } }).start(); } catch (Exception e1) {<br> TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); json.put( "msg" , "导入失败!" ); json.put( "code" , "500" ); e1.printStackTrace(); } json.put( "msg" , "导入成功!" ); json.put( "code" , "0" ); return json; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * 获取服务器上的文件 */ public static List<String[]> getXlsList(String desPath) { List<String[]> xlsList = new ArrayList<String[]>(); try { //根据绝对路径获取服务器文件 File cfile = new File(desPath); // 从excel中读取数据 InputStream is = new FileInputStream(cfile); //这里用BufferedInputStream再包装一层,可解决:mark/reset not supported问题 BufferedInputStream bis = new BufferedInputStream(is); ExcelTypeEnum excelType = null ; if (POIFSFileSystem.hasPOIFSHeader(bis)) { //2003及以下 excelType = ExcelTypeEnum.HSSF; } if (POIXMLDocument.hasOOXMLHeader(bis)) { //2007及以上 excelType = ExcelTypeEnum.XSSF; } if (excelType == null ) { throw new IllegalArgumentException( "请使用2007及以上版本或2003以下excel版本" ); } xlsList = ExcelUtil.loadDataFromExcel(bis, excelType, 0 , 0 , 20 , 0 , 5000 ); } catch (IOException e) { e.printStackTrace(); } return xlsList; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界