【JavaWeb】WEB下的excel批量导入功能

开发中使用Excel导出功能实现的整个流程。使用框架ssm。

control层 importExcel+parseDataItem:

[java]  view plain  copy
  1. @RequestMapping("importExcel.do")  
  2.   public String importExcel(@RequestParam MultipartFile uploadfile,   
  3.           HttpServletRequest request, HttpServletResponse response) {  
  4.       String fileName = uploadfile.getOriginalFilename();  
  5.       if (StringUtils.isEmpty(fileName)) {  
  6.           System.out.println("未上传文件名为空");  
  7.       }  
  8.       String tempPath = request.getSession().getServletContext().getRealPath("/")  
  9.               + "upload";  
  10.       File dir = new File(tempPath);      
  11.       if (!tempPath.endsWith(File.separator)) {  
  12.           tempPath = tempPath + File.separator;  
  13.       }  
  14.       if (!dir.exists()) {  
  15.           dir.mkdirs();  
  16.       }  
  17.       System.out.println(tempPath);  
  18.       //制作路径  
  19.       String newFile = tempPath + fileName;  
  20.       File file = new File(newFile);          
  21.       try {  
  22.           FileCopyUtils.copy(uploadfile.getBytes(), file);  
  23.           //导入excel中的内容  
  24.           this.<span style="color:#ff0000;">parseDataItem</span>(newFile);  
  25.           System.out.println("成功导入");  
  26.       } catch (IOException e) {  
  27.           e.printStackTrace();  
  28.       } finally {  
  29.           try {  
  30.               FileUtils.forceDelete(file);  
  31.           } catch (IOException e) {  
  32.               e.printStackTrace();  
  33.               return "uploadfail";  
  34.           }  
  35.       }  
  36.       return "uploadsuccess";  
  37.   }  
  38.   
  39.   public final boolean <span style="color:#ff0000;">parseDataItem</span>(String file){  
  40.         
  41.      return ysdwAnimalService.<span style="color:#ff0000;">importExcel</span>(file);  
  42.   }  
ysdwAnimalService层 import 调用底层通用方法readExcel:

[java]  view plain  copy
  1. @Transactional  
  2.     public boolean importExcel(String file) {  
  3.         final int rowStart = 2;  
  4.         final int cellStrart = 0;        
  5.         List<YsdwAnimal> list = new LinkedList<YsdwAnimal>();      
  6.         YsdwAnimal ysdwAnimal = null;  
  7.         try {  
  8.             List<Object> dataList = ReadExcleUtils.<span style="color:#ff0000;">readExcel</span>(file, new YsdwAnimalExcel(), rowStart, cellStrart);  
  9.             for (Object object : dataList) {  
  10.                YsdwAnimalExcel excel = (YsdwAnimalExcel) object;  
  11.                 ysdwAnimal = new YsdwAnimal();                 
  12.                 String uuid = CommonUtils.getUuid();  
  13.                 ysdwAnimal.setId(uuid);  
  14.                 ysdwAnimal.setAnimalname(excel.getAnimalname());  
  15.                 ysdwAnimal.setAnimalnumber(excel.getAnimalnumber());  
  16.                 ysdwAnimal.setAnimaltypes(excel.getAnimaltypes());  
  17.                 ysdwAnimal.setVegetationtypes(excel.getVegetationtypes());  
  18.                 ysdwAnimal.setJingdu(excel.getJingdu());  
  19.                 ysdwAnimal.setWeidu(excel.getWeidu());  
  20.                 ysdwAnimal.setPodu(excel.getPodu());  
  21.                 ysdwAnimal.setPowei(excel.getPowei());  
  22.                 ysdwAnimal.setPoxiang(excel.getPoxiang());  
  23.                 ysdwAnimal.setZuobiao(excel.getZuobiao());  
  24.                 ysdwAnimal.setHaiba(excel.getHaiba());  
  25.                 ysdwAnimal.setTianqi(excel.getTianqi());  
  26.                 ysdwAnimal.setJilusj(excel.getJilusj());  
  27.                 ysdwAnimal.setQita(excel.getQita());        
  28.                 ysdwAnimal.setDid(excel.getDid());  
  29.                 ysdwAnimal.setBaohdj(excel.getBaohdj());  
  30.                 list.add(ysdwAnimal);                
  31.             }             
  32.             //存库  
  33.             for (YsdwAnimal YsdwAnimal : list) {  
  34.                 YsdwAnimalMapper.saveOrUpdate(YsdwAnimal);  
  35.                 System.out.println("存库");  
  36.             }  
  37.         } catch (IOException e) {  
  38.             e.printStackTrace();  
  39.             return false;  
  40.         }  
  41.         return true;  
  42.           
  43.     }  
底层通用方法readExcel

[java]  view plain  copy
  1. /** 
  2.      * 读取EXCLE2007的方法 
  3.      * @param filePath 文件名 
  4.      * @param obj 对象名 
  5.      * @param rowStart 起点行(从0开始) 
  6.      * @param cellStrart 起点列(从0开始) 
  7.      * @return 对象集合 
  8.      * @throws IOException 
  9.      */  
  10.     @SuppressWarnings("rawtypes")  
  11.     public static List<Object> readExcel(final String filePath, final Object obj, final int rowStart, final int cellStrart) throws IOException {  
  12.         List<Object> aList = null;  
  13.         final String extension = filePath.substring(filePath.lastIndexOf(".")+1, filePath.length());//截取文件扩展名  
  14.         final Class c = obj.getClass();//获得类对象  
  15.         <span style="color:#cc0000;">final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性</span>  
  16.         final File excelFile = new File(filePath);   
  17.         final InputStream is = new FileInputStream(excelFile);// 获取文件输入流  
  18.         if ("xlsx".equals(extension)) {//解析2007  
  19.             aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2007</span>(c, is, filds, rowStart, cellStrart);  
  20.         } else if ("xls".equals(extension)) {  
  21.             aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2003</span>(c, is, filds, rowStart, cellStrart);  
  22.         } else {  
  23.             System.out.println("上传文件不正确");  
  24.         }  
  25.         return aList;  
  26.     }  
  27.       
  28.     @SuppressWarnings("rawtypes")  
  29.     private static List<Object> analyExcle2007(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {  
  30.         Object objs = null;  
  31.         Map<String,Object> mapAtt = null;  
  32.         final List<Object> aList = new ArrayList<Object>();  
  33.         final XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象    
  34.         final XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引是0  
  35.         final XSSFFormulaEvaluator evaluator=new XSSFFormulaEvaluator(workbook2007);  
  36.         for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {  
  37.             String cellStr = null;// 单元格,最终按字符串处理  
  38.             final XSSFRow row = sheet.getRow(i);// 获取行对象    
  39.             if (row == null) {// 如果为空,不处理    
  40.                 continue;    
  41.             }else {  
  42.                 mapAtt = new HashMap<String,Object>();  
  43.                 for (int j = 0; j < filds.length; j++) {  
  44.                     final XSSFCell cell = row.getCell(j+cellStrart);  
  45.                     //判断单元格的数据类型     
  46.                     if (cell != null) {  
  47.                         //对时间的特殊处理  
  48.                         int dataFormat = cell.getCellStyle().getDataFormat();  
  49.                         if (dataFormat == 14 || dataFormat == 176 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {  
  50.                             cellStr = ReadExcleUtils.getDateValue2007(cell);  
  51.                         } else{  
  52.                             switch (cell.getCellType()) {  
  53.                             case HSSFCell.CELL_TYPE_NUMERIC://数值  
  54.                                 BigDecimal db = new BigDecimal(cell.getNumericCellValue());  
  55.                                 if (db.toString().indexOf(".") != -1) {  
  56.                                     java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");  
  57.                                     cellStr = dfomat.format(db);  
  58.                                 }else {  
  59.                                     cellStr = db.toPlainString();  
  60.                                 }  
  61. //                              cellStr = db.toPlainString();  
  62. //                              cellStr = String.valueOf(cell.getNumericCellValue());  
  63.                                 break;  
  64.                             case HSSFCell.CELL_TYPE_STRING://字符串  
  65.                                 cellStr = cell.getStringCellValue();  
  66.                                 break;  
  67.                             case HSSFCell.CELL_TYPE_BOOLEAN://布尔  
  68.                                 cellStr = String.valueOf(cell.getBooleanCellValue());  
  69.                                 break;  
  70.                             case HSSFCell.CELL_TYPE_FORMULA://公式  
  71.                                 cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());  
  72.                                 break;  
  73.                             case HSSFCell.CELL_TYPE_BLANK://空值  
  74.                                 cellStr =  "";  
  75.                                 break;  
  76.                             default:  
  77.                                 cellStr = cell.getStringCellValue();  
  78.                                 break;  
  79.                             }  
  80.                         }  
  81.                     } else {  
  82.                         cellStr = null;  
  83.                     }  
  84.                     //讲单元格中的数据放入集合中  
  85.                     mapAtt.put(filds[j].getName(), cellStr);  
  86.                 }  
  87.             }  
  88.             try {  
  89.                 objs = c.newInstance();  
  90.                 ReadExcleUtils.invokeMethod(c, objs, mapAtt);  
  91.                 aList.add(objs);  
  92.             } catch (InstantiationException e) {  
  93.                 // TODO Auto-generated catch block  
  94.                 e.printStackTrace();  
  95.             } catch (IllegalAccessException e) {  
  96.                 // TODO Auto-generated catch block  
  97.                 e.printStackTrace();  
  98.             }  
  99.         }  
  100.         return aList;  
  101.     }  
  102.       
  103.     @SuppressWarnings("rawtypes")  
  104.     private static List<Object> analyExcle2003(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {  
  105.         Object objs = null;  
  106.         Map<String,Object> mapAtt = null;  
  107.         final List<Object> aList = new ArrayList<Object>();  
  108.         final HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 创建Excel2003文件对象   
  109.         final HSSFSheet sheet = workbook2003.getSheetAt(0);// 取出第一个工作表,索引是0  
  110.         final HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook2003);  
  111.         for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {  
  112.             final HSSFRow row = sheet.getRow(i);// 获取行对象  
  113.             if (row == null) {// 如果为空,不处理    
  114.                 continue;    
  115.             }else {  
  116.                 mapAtt = new HashMap<String,Object>();  
  117.                 for (int j = 0; j < filds.length; j++) {  
  118.                     String cellStr = null;// 单元格,最终按字符串处理  
  119.                     final HSSFCell cell = row.getCell(j+cellStrart);  
  120.                     //判断单元格的数据类型     
  121.                     if (cell != null) {  
  122.                         //对时间的特殊处理  
  123.                         int dataFormat = cell.getCellStyle().getDataFormat();  
  124. //                      if (dataFormat == 14 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {  
  125.                         if (dataFormat == 14 || dataFormat == 31 || dataFormat == 57 || dataFormat == 58) {  
  126.                             cellStr = ReadExcleUtils.getDateValue2003(cell);  
  127.                         } else{  
  128.                             switch (cell.getCellType()) {  
  129.                             case HSSFCell.CELL_TYPE_NUMERIC://数值  
  130.                                 BigDecimal db = new BigDecimal(cell.getNumericCellValue());  
  131.                                 if (db.toString().indexOf(".") != -1) {  
  132.                                     java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");  
  133.                                     cellStr = dfomat.format(db);  
  134.                                 }else {  
  135.                                     cellStr = db.toPlainString();  
  136.                                 }  
  137.                                 break;  
  138.                             case HSSFCell.CELL_TYPE_STRING://字符串  
  139.                                 cellStr = cell.getStringCellValue();  
  140.                                 break;  
  141.                             case HSSFCell.CELL_TYPE_BOOLEAN://布尔  
  142.                                 cellStr = String.valueOf(cell.getBooleanCellValue());  
  143.                                 break;  
  144.                             case HSSFCell.CELL_TYPE_FORMULA://公式  
  145.                                 cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());  
  146.                                 break;  
  147.                             case HSSFCell.CELL_TYPE_BLANK://空值  
  148.                                 cellStr =  "";  
  149.                                 break;  
  150.                             default:  
  151.                                 cellStr = cell.getStringCellValue();  
  152.                                 break;  
  153.                             }  
  154.                         }  
  155.                     } else {  
  156.                         cellStr = null;  
  157.                     }  
  158.                     //讲单元格中的数据放入集合中  
  159.                     mapAtt.put(filds[j].getName(), cellStr);  
  160.                 }  
  161.             }  
  162.             try {  
  163.                 objs = c.newInstance();  
  164.                 ReadExcleUtils.invokeMethod(c, objs, mapAtt);  
  165.                 aList.add(objs);  
  166.             } catch (InstantiationException e) {  
  167.                 // TODO Auto-generated catch block  
  168.                 e.printStackTrace();  
  169.             } catch (IllegalAccessException e) {  
  170.                 // TODO Auto-generated catch block  
  171.                 e.printStackTrace();  
  172.             }  
  173.         }  
  174.         return aList;  
  175.     }  
注意!!在底层方法种完成对excel表格字段顺序的控制,具体控制语句为:final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性

这就是从底层开始导入excel的完整过程。

文章来源于:http://blog.csdn.net/zh964822413/article/details/68953218

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于本学期学习的Java web开发技术,开发一个名片管理系统,实现名片的添加、删除、修改、查询、数据的上传下载等相关的功能。 具体完成如下3个模块的功能: 1.用户登录与注册模块 系统的使用者必须是注册用户,一个注册用户需要注册的信息有:用户登录名、密码、用户真实名字等信息。该模块具有两个功能: (1)用户登录:在登录时,如果用户名和密码正确,进入系统页面。 (2)用户注册:新用户应该先注册,然后再登录该系统。 2.名片管理模块 一个名片包含信息有:序号(id)、姓名、性别、登录账号、密码、电子邮箱等有关信息,需要完成对名片有关的管理操作,主要有: (1)增加名片:增加名片信息到数据库内。 (2)修改名片:修改名片信息。 (3)查询名片:以模糊查询方式查询名片。 (4)删除名片:名片的删除由2种方式,即把名片移到回收站,把名片彻底删除。 (5)可以实现名片批量导入和导出,即将查询满足条件的所有名片导入Excel中,也可以将Excel中存放的名片信息导入到数据库中。 (6)浏览/查询:可以模糊查询、浏览目前有效的名片。 3.回收站管理模块 (1)还原:把回收站中的名片还原回收。 (2)彻底删除:把名片彻底从回收站删除。 (3)浏览/查询:可以模糊查询、浏览回收站中的名片
基于JavaWebExcel上传和数据的批量导入是指在使用JavaWeb技术开发的网站或应用中,通过上传Excel文件实现数据的批量导入功能。 首先,前端界面需要提供一个文件上传的功能,用户可以选择Excel文件,并通过表单的形式将文件提交到后台。可以使用HTML的input标签的type属性设置为"file",然后使用JavaScript对文件进行读取和校验。 后台服务器接收到上传的Excel文件后,需要使用Java中的相关API(如Apache POI)解析Excel文件和读取数据。可以通过POI库的Workbook类和Sheet类,逐行读取Excel文件中的数据,并将数据存储到Java的集合对象中。 接下来,对于读取的数据进行校验和处理。可以通过Java代码对Excel文件中的每行数据进行验证,确保数据的正确性和完整性。可以根据业务需求进行数据校验,如验证数据的格式、范围、唯一性等。对于无效的数据,可以进行标记或丢弃。 最后,将校验通过的数据存储到数据库中。可以使用Java中的数据库连接工具(如JDBC)与数据库进行交互,将读取到的数据批量插入到数据库的对应表中。可以使用预编译的SQL语句和批处理技术(如JDBC的addBatch和executeBatch方法)提高插入数据的效率和性能。 需要注意的是,对于大规模的Excel文件和数据量较大的情况,可以考虑分批次读取和处理数据,以及添加进度条或异步处理等优化措施,以提高系统的稳定性和用户体验。 总结起来,基于JavaWebExcel上传和数据的批量导入需要通过前端页面的文件上传、后台Java代码的Excel解析与数据处理,以及与数据库的交互实现。这样就可以方便地将Excel表格中的数据批量导入到系统中,提高数据导入的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值