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

项目中需要用到数据录入,由此需要在项目中做一个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; 
		//接受数据对象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
	}

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

谢谢~



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值