POI解决EXCLE导入03,07兼容性问题
2015-08-21 09:44
555 查看
项目中需要用到数据录入,由此需要在项目中做一个EXCLE导入数据功能,原先项目导入是用jxl写的,我进行用poi优化与改造。
我们先写一个工具类来判断文件的格式与版本。
更改Cell的类型格式方法:
JAVA中对Dataset的操作:
总结:尽量匹配数据不需要动用数据库就不要动用数据库,将数据存入程序中检索,这对性能上会有极大的提高。
减少数据库语句执行次数也是提升性能的办法之一。有什么疑问,请留言或评论,还有更好的方法可以和我交流分享下
谢谢~
我们先写一个工具类来判断文件的格式与版本。
<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; //接受数据对象List List<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 }
总结:尽量匹配数据不需要动用数据库就不要动用数据库,将数据存入程序中检索,这对性能上会有极大的提高。
减少数据库语句执行次数也是提升性能的办法之一。有什么疑问,请留言或评论,还有更好的方法可以和我交流分享下
谢谢~
相关文章推荐
- Xposed源码剖析——app_process作用详解
- 【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节
- Python数组过滤
- [转]GridControl各种事件
- ios线程-GCD
- 解决 win32控制台程序一闪而过
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- Hibernate知识点
- poj 3259 Wormholes 【SPFA&&判断负环】
- push和pushl的区别
- linux c++下gb18030、utf8之间的转换
- Nginx Proxy cache + Perl + ImageMagick 做Wap站图片适配 实时压缩
- .NET开发不能不知道的CMD命令
- 后端开发书架2015