Java-POI导入Excel数据预览与保存

开发工具与关键技术:Java/MyEclipse 10
作者:张俊辉
撰写时间:2019年07月08日

本文需要使用到5个jar包分别是:poi-3.8-20120326.jarpoi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jardom4j-1.6.1.jarxmlbeans-2.3.0.jar
书写方法InputtingExcelPreview传入文件类型,返回类型为 ReturnListJson<T>
先声明一个输入流 InputStream 并把文件转换为输入流:InputStream is = new FileInputStream(file);
然后声明一个工作簿WorkbookWorkbook hssfWorkbook = null;获取文件名,判断文件的格式如果为xlsx则以XSSFWorkbook类读取文件,如果为xls则以HSSFWorkbook类读取文件,如下:

String fileName=file.getName();
if (fileName.endsWith("xlsx")){
	hssfWorkbook = new XSSFWorkbook(is);
}else if (fileName.endsWith("xls")){
	hssfWorkbook = new HSSFWorkbook(is);
}

声明一个int类型的变量存放Excel表格除首行以外的总行数,再声明一个int类型存放符合条件的数据的行数声明一个 List<T> 存放读取成功的数据,如下:

int count=0;
int success=0;
List<SelectSupplierVo> listSupplier=new ArrayList<SelectSupplierVo>();

通过循环遍历工作表,获取该工作表的首行,再循环遍历工作表内的行,实例化一个与数据对应的po类或vo类,然后循环遍历行内的单元格,声明一个String类型的参数接收首行单元格的值判断单元格的值,再声明一个String类型的参数接收对应列的值,通过比较首行单元格的值判断表格是否是需要导入的表格,再判断对应列的值是否符合条件,符合条件的添加到实例后的po类或vo类中,不符合则跳出该行内单元格循环,当该行所有单元格符合条件时把实例后的po类或vo类放入 List<T> 序列中。最后把序列写入返回的数据的类中,在servlet中,把返回的数据中的List<T> 保存到Session中,返回的数据转换为JSON格式返回到页面,代码如下:

// 循环工作表Sheet
for (int i = 0; i <hssfWorkbook.getNumberOfSheets(); i++) {
	 //HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet
     Sheet hssfSheet = hssfWorkbook.getSheetAt(i);
     if (hssfSheet == null) {continue;}
	  Row topRow = hssfSheet.getRow(0);
      count+=hssfSheet.getLastRowNum();
	  // 循环行Row
	  for (int j = 1; j <= hssfSheet.getLastRowNum(); j++) {
	       SelectSupplierVo supplierVo=new SelectSupplierVo();
	       Row hssfRow = hssfSheet.getRow(j);
	       if (hssfRow != null) {
	        	  boolean state=true;
	          for (int k = 0; k < topRow.getLastCellNum(); k++) {
	          String name=topRow.getCell(k).toString().trim();
	          String value = hssfRow.getCell(k).toString().trim();
	          if(value==null){ value="";}
			  if("供应商名称".equals(name)){
			      supplierVo.setSupplierName(value);
			  } else if("跟进人".equals(name)){
				  IUserDao userDao=new UserDaoImpl();
			  	  if(!"".equals(value)&&value!=null){
				  	 int userID=userDao.SelectUserByUserName(value);
			  	     if(userID>0){
				 	    supplierVo.setUserID(userID);
				 	    supplierVo.setUserName(value);
			  	     }else{
				  	    state=false;continue;
			  	     }
			      }else{
		    			state=false;continue;
			    	  }
			 } else{
				return new ReturnListJson<SelectSupplierVo>(2,"表头格式错误!",0,null);
			 }
	     }
	     if(state==true){
			  success++;listSupplier.add(supplierVo);
	      }
	  }
   }
}
listJson=new ReturnListJson<SelectSupplierVo>(1,"共预览"+count+"条,成功预览"+success+"条,数据异常"+(count-success)+"条!",0,listSupplier);

保存数据时在页面请求servlet内的方法读取Session中的 List<T> 并传递到DaoImpl内的方法中使用迭代器循环遍历调用新增SQL语句并赋值后执行即可。

conn=DBUtil.getConnection();
for (Iterator<SelectSupplierVo> iterator=listSupplier.iterator();iterator.hasNext();) {
	ps=conn.prepareStatement(insertSupplier);
	SelectSupplierVo selectSupplierVo = (SelectSupplierVo) iterator.next();
	ps.setInt(1,selectSupplierVo.getUserID());ps.executeUpdate()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值