POI解决EXCLE导入03,07兼容性问题

来源:互联网 发布:centos6.5图形网络配置 编辑:程序博客网 时间:2024/05/29 19:05

项目中需要用到数据录入,由此需要在项目中做一个EXCLE导入数据功能,原先项目导入是用jxl写的,我进行用poi优化与改造。

我们先写一个工具类来判断文件的格式与版本。

<span style="white-space:pre"></span>/** * 获取文件名称后缀 * @param filename * @return */public static String getExtensionName(String filename) {  if ((filename != null) && (filename.length() > 0)) {      int dot = filename.lastIndexOf('.');          if ((dot > -1) && (dot < (filename.length() - 1))) {               return filename.substring(dot + 1);            }      }       return filename;  }  
导入domain层代码:

/** * 导入 * @param pset */public void insertProjectCform(ParameterSet pset){//楼上获取文件流信息Record record=(Record)pset.get("records");ExcelUploadFile excelUploadFile=(ExcelUploadFile)record.toBean(ExcelUploadFile.class);UploadFile file =excelUploadFile.getCformFile();<span style="font-family: Arial, Helvetica, sans-serif;">//平常的获取路径的写法,是适用于本机。</span>Workbook xwb = null;//定义工作簿try {if(FileUtil.getExtensionName(file.toString()).equals("xls")){xwb = new HSSFWorkbook(file.getInputStream());//System.out.print("xls版本");}else{xwb = new XSSFWorkbook(file.getInputStream());//System.out.print("xlsx版本");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}/*********读取excel里的数据**************/Sheet uploadsheet=xwb.getSheetAt(0);Row row = null;//对应excle的行//接受数据对象Syj  syj = null; //接受数据对象ListList<Syj> list = new ArrayList<Syj>();//定义删除所需的List集合List<String> delList =  new ArrayList<String>();//定义批量删除所需的数组Object[] delarray = null;int totalRow = uploadsheet.getLastRowNum();//得到excle的总记录条//企业名称集合List<String> qymcList =  new ArrayList<String>();for (int i = 1; i <= totalRow; i++) {row = uploadsheet.getRow(i);qymcList.add(row.getCell(1).toString());}<span style="white-space:pre"></span>//数据集DataSet ds = qcmd.queryJgdmXzqhXzqhdm(qymcList);for (int i = 1; i <= totalRow; i++) {   syj = new Syj();    row = uploadsheet.getRow(i);   if(row.getCell(0).toString()==""){//数据主件为空则结束循环,EXCLE用户可能并没输入信息但是表格也在也会被读取会报空值错误   break;   }   String Qymc= row.getCell(1).toString();   Record recordds=GetRecord(Qymc,ds);  //java中的Ds并没有检索信息的功能只能自己写了....   syj.setXxxx(row.getCell(0).toString());//   Cell cell=row.getCell(7);//   cell.setCellType(Cell.CELL_TYPE_STRING);//设置列的类型为String 要不然有时候数是浮点   syj.setLxdh(getCellValue(row.getCell(7)));//调用后面写的格式方法   //对机构代码集合进行遍历,查找出单条数据匹配的对象   //将匹配到的对象,赋值 /   //   syj.setgggg(zjjdao.queryXXXX(syj.getQymc()));//   syj.setxxxzqh(zjjdao.queryAAA(syj.getJgdm()));//   syj.setxxxxzqhdm(zjjdao.queryBBB(syj.getJgdm()));     //上面的方法对性能来说比较差,每一次都要去数据库匹配这样不行~<span style="white-space:pre"></span> //获取数据集DS中检索出来匹配的记录进行赋值   if(recordds!=null){   syj.setgggg(recordds.get("zzjgdm").toString());   syj.set<span style="font-family: Arial, Helvetica, sans-serif;">xxxzqh</span>(recordds.get("xzqh").toString());   syj.setxxxxzqhdm(recordds.get("xzqhdm").toString());     }   <span style="white-space:pre"></span>//批量删除LIST集合   delList.add(syj.getXkzh());<span style="white-space:pre"></span>//批量插入LIST集合   list.add(syj);}delarray = delList.toArray();/*批量操作*/dao.batchDelete(delarray);dao.batchInsert(list);}

更改Cell的类型格式方法:

/* * 依据用户可能输入错误(电话号码不是字符串格式,和日期不是字符串格式) */public String getCellValue(Cell cell){String value = null;switch(cell.getCellType()){case Cell.CELL_TYPE_STRING://字符串类型value = cell.getStringCellValue(); //必须加~要不然调用的时候会变空值break;case Cell.CELL_TYPE_NUMERIC:cell.setCellType(Cell.CELL_TYPE_STRING);//将Excle列格式转换value = cell.getStringCellValue();break;default:break;}return value;}

JAVA中对Dataset的操作:

<span style="white-space:pre"></span>/** * 从数据集ds中检索需要的信息记录并提取出来 * @param qymc * @param ds * @return */public Record GetRecord(String str,DataSet ds){Record R = null;Record R1 = null;for(int i=0;i<=ds.getCount()-1;i++){R1=ds.getRecord(i);if(R1.get("记录中的值").equals(str)){R=R1;}}return R; //返回record}

总结:尽量匹配数据不需要动用数据库就不要动用数据库,将数据存入程序中检索,这对性能上会有极大的提高。
减少数据库语句执行次数也是提升性能的办法之一。有什么疑问,请留言或评论,还有更好的方法可以和我交流分享下

谢谢~



1 0