因业务需求要实现数据的批量导入,给了指定的excel模板上传文件,用java代码实现导入excel文件。

重新复习下。

下面是源码,仅供参考。

controller层代码,创建临时目录后,使用DiskFileItemFactory类来实现文件上传,List parseRequest(HttpServletRequest request)方法来解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

 @RequestMapping("/doImport")@ResponseBody@Transactional(rollbackFor = Exception.class, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)public Map<String, Object> doImport(HttpServletRequest request, HttpSession session) throws Exception{Map<String, Object> map = new HashMap<>();String path = System.getProperty("web.root");//创建临时文件目录String tempPath = path + File.separator + "attach" + File.separator;//创建File类实例File tempFile = new File(tempPath + "temp");int userId = PubFunc.parseInt(session.getAttribute("user_id"));try {//创建FileItem 对象的工厂DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//指定临时文件目录diskFileItemFactory.setRepository(tempFile);//负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem 对象中ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);//解析request对象,把表单中的每一个输入项包装成一个fileItem 对象List<FileItem> lists = servletFileUpload.parseRequest(request);int len = lists.size();for (int n = 0; n < len; n++) {FileItem item = lists.get(n);if (!item.isFormField()) {if (item.getName().length() > 0) {InputStream inputStream = item.getInputStream();unabledService.doImportExl(item.getName(), inputStream, userId);map.put("code",0);map.put("msg", "文件上传中,稍后自动跳转" );}}}}catch (FileNotFoundException e) {map.put("code",1);map.put("msg", "文件未找到或文件格式错误!");} catch (IOException e) {map.put("code",2);map.put("msg", "文件内容读取失败");} catch (IllegalAccessException e) {map.put("code",3);map.put("msg", "用户信息写入失败");} catch (NoSuchFieldException e) {map.put("code",4);map.put("msg", "找不到该属性值");} catch (NullPointerException e) {map.put("code",5);map.put("msg", "文件未上传");} catch (InvalidFormatException e) {map.put("code",6);map.put("msg", "文件格式错误");} catch (Exception e) {e.printStackTrace();map.put("code",7);map.put("msg", e.getMessage());}return map;}

service层代码,里面有两个方法需要注意,一个是readExcel(fileName,inputStream)方法,通过流来读取excel数据,并对excel里面的数据做重复校验。另一个是insert_batch(unableds,userId)方法,用来将数据批量插入,

  /*** 执行导入数据操作** @param fileName    文件名* @param inputStream 数据流* @throws NoSuchFieldException* @throws IllegalAccessException*/@Overridepublic int doImportExl(String fileName, InputStream inputStream, int userId) throws Exception {//读取数据List<Map<String, Object>> list = readExcel(fileName, inputStream);if (list == null || list.isEmpty()) {throw new Exception("导入数据存在相同手机号");}//插入数据条数记录int i = 0;//迭代器Iterator<Map<String, Object>> iterator = list.iterator();Map<String, Object> fieldMap = getFieldsMap(122);List<Unabled> unableds = new ArrayList<>();while (iterator.hasNext()) {Map<String, Object> map = iterator.next();Unabled unabled = new Unabled();//反射获取所有属性Class<? extends Unabled> clazz = unabled.getClass();for (String key : fieldMap.keySet()) {String value = PubFunc.toString(map.get(PubFunc.toString(fieldMap.get(key))));if (!PubFunc.isNullStr(value)) {Field field = clazz.getDeclaredField(key);//设置私有属性允许更改field.setAccessible(true);field.set(unabled, value);}}unableds.add(unabled);}int res = insert_batch(unableds, userId);return res;}

readExcel(fileName,inputStream)方法代码

 private List<Map<String, Object>> readExcel(String fileName, InputStream inputStream) throws IOException, InvalidFormatException {//校验文件boolean ret = isXls(fileName);Workbook wb = null;//根据后缀新建对应的工作簿if (ret) {wb = new HSSFWorkbook(inputStream);} else {wb = WorkbookFactory.create(inputStream);}//获取第一个sheetSheet sheet = wb.getSheetAt(0);//标题行Row titleRow = sheet.getRow(0);//获取最大行数及列数int max_row = sheet.getLastRowNum();int max_cell = titleRow.getLastCellNum() - 1;//存放数据List<Map<String, Object>> list = new ArrayList<>();//存放手机号做重复校验for (int i = 1; i <= max_row; i++) {Map<String, Object> map = new HashMap<>();Row row = sheet.getRow(i);if (row == null) {break;}for (int j = 0; j < max_cell; j++) {String cellTitle = titleRow.getCell(j).getStringCellValue();Cell cell = row.getCell(j);String cellValue;//对空值进行处理if (cell == null) {cellValue = "";} else {cell.setCellType(Cell.CELL_TYPE_STRING);cellValue = cell.getStringCellValue();}map.put(cellTitle, cellValue);}list.add(map);}wb.close();return list;}

insert_batch(unableds,userId)方法代码,newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.DEFAULT)public int insert_batch(List<Unabled> unableds, int userId) throws Exception {//创建一个线程安全的ConcurrentHashMap集合ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程ExecutorService threadPoolExecutor = Executors.newCachedThreadPool();// 主线程等待子线程执行完成再执行final CountDownLatch countDownLatch = new CountDownLatch(unableds.size() / 500 == 0 ? 1 : unableds.size() / 500);for (int i = 0; i < unableds.size(); i += 500) {if (i > unableds.size()) {break;}int j = i + 500;List<Unabled> list = j > unableds.size() ? unableds.subList(i, unableds.size()) : unableds.subList(i, j);threadPoolExecutor.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":" + System.currentTimeMillis());for (int k = 0; k < list.size(); k++) {Unabled unabled = list.get(k);int res = 0;try {//插入数据res = insert(unabled, userId);System.out.println("用户添加/更新成功:" + unabled.getF_1402() + ":" + unabled.getF_1403());} catch (Exception e) {System.out.println("用户添加失败:" + unabled.getF_1402() + ":" + unabled.getF_1403());}if (res == 0) {map.put(unabled.getF_1402(), unabled);}}//如果计数到达零,则释放所有等待的线程countDownLatch.countDown();System.out.println(Thread.currentThread().getName() + ":" + System.currentTimeMillis());}});}countDownLatch.await();threadPoolExecutor.shutdown();for (String key : map.keySet()) {log.info("导入失败:" + key);System.out.println("导入失败:" + key);throw new Exception("导入失败: " + key+",该用户手机号可能被占用");}return 0;}

java代码实现excel文件数据导入相关推荐

  1. java代码实现excel文件转换为csv文件

    java代码实现excel文件转换为csv文件 pom文件导入 <dependencies><dependency><groupId>org.springframe ...

  2. Excel文件数据导入到MySQL数据库

    这里以Navicat客户端工具为例,当然版本也有关系这里我用的是16. 1.把Excel文件数据第一行改成对应的数据库字段 2.右键目标表-->导入向导-->选择excel文件格式 3.注 ...

  3. net以execl做数据库_C#.NET Excel文件数据导入SQL Server数据库完整代码

    展开全部 在日常的项目中,Excel,Word,txt等格式的数62616964757a686964616fe58685e5aeb931333337626235据导入到数据库中是很常见 这里将分为.n ...

  4. Java POI实现Excel文件批量导入(兼容xls,xlsx)

    1.POI使用详解 1.1.什么是Apache POI? POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Micros ...

  5. java代码将excel文件中的内容列表转换成JS文件输出

    思路分析 我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走: 1.把excel文件中的内容读出来: 2.将内容写到新的文件中. 举例 一张excel表中有一个表格: 我们需要将 ...

  6. java代码读取excel文件_Java 读取excel 文件流代码实例

    这篇文章主要介绍了Java 读取excel 文件流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public static vo ...

  7. java代码读取excel文件,同时兼容2003和2007

    后台服务器需要一个读取excel文件的工具,查了些资料,很多不能同时兼容2003和2007,整理了一下,加了一个判断,现在能同时兼容2003和2007,并且可以选择从表格的第几行开始读取.主要用到了a ...

  8. excel文件数据导入mysql数据库中_将excel里面的数据导入mysql数据库中

    展开全部 条件:PC端已经安装Navicat工具,并636f70793231313335323631343130323136353331333363386161且已经成功连接至数据库. 1.点击鼠标右 ...

  9. Python批量Excel文件数据导入SQLite数据库的优化方案

    说明:1)需要安装扩展库openpyxl:2)随着数据库的增大,导入速度可能会有所下降:3)本文只考虑Python代码优化,没有涉及数据库的优化:4)本文要点在于使用executemany实现批量数据 ...

最新文章

  1. 秒杀系统设计~亿级用户
  2. 导入android studio项目,编译失败
  3. 服务器无法通过系统非页面共享区来进行分配,因为共享区当前是空的解决办法.供参考....
  4. 利用binlog进行数据库的还原
  5. 为什么刹车热了会失灵_网曝比亚迪汉“刹车失灵”,比亚迪称:是IPB模块仪表显示问题...
  6. css a标签去掉下划线_CSS -- 三大特性
  7. [蓝桥杯][2016年第七届真题]压缩变换(主席树求区间不同数的个数)
  8. pymc3使用_使用PyMC3了解飞机事故趋势
  9. CANOpen同步报文
  10. iPhone 13 Pro“终极”渲染图曝光:后置镜头模组将有大幅升级
  11. AIX安装JDK1.7教程
  12. 用python做个网络爬虫
  13. 使用Robomongo 连接MongoDB 3.x 报 Authorization failed 解决办法(转)
  14. 【优化配置】基于matlab遗传算法求解风电混合储能容量优化配置问题【含Matlab源码 228期】
  15. 如何设计实时数据平台(技术篇)
  16. Ubuntu16.04在Wine-3.0平台安装最新版TIM(QQ),不折腾那些没用的!
  17. 机械设计基础复习重点
  18. 黑苹果 hackintosh 声卡驱动
  19. 超详细 WebPack 入门教程
  20. 关于安卓上pcm文件转wav全是噪音解决办法

热门文章

  1. 风丘科技为您提供Q-Vision+Kvaser CAN/CAN FD/LIN总线解决方案
  2. EasyClick IOS 自动化测试 使用前置准备
  3. Arrays.sort() 实现降序排列 Comparator接口实现的坑
  4. IOS苹果手机上有哪些好用的txt小说阅读器?
  5. WordPress免费主题JianYue如何设置和添加友情链接?
  6. 零基础能不能学计算机专业,零基础新手可不可以学会计算机电脑
  7. 「代码家」的学习过程和学习经验分享【转】
  8. 基于EasyNVR摄像机网页无插件直播服务二次开发实现H5播放页面的简单集成方案
  9. 怪诞行为学中的一些例子
  10. 沉睡者IT - 什么是Web3.0?