用poi解析excel文件所有工作薄

    最近在做给一个Web项目做维护,需要用poi解析excel文档,从中获取正确的ip地址插入到数据库中。在编写过程中遇到了一些问题,在网上查了好多资料,终于完成了。现在将代码和遇到的问题跟大家分享一下,如果有不正解的地方,请大家多多指出、批评。

方法一:根据上传的Excel文档和名称,获取Workbook

	public Workbook getWorkbook(File file ,String fileName) throws IOException{
		Workbook wb = null;
		InputStream is = null;
			if (file.exists()) {
				is = new FileInputStream(file);
				if(!is.markSupported()){
					is = new PushbackInputStream(is,8);			
				}
				if (POIFSFileSystem.hasPOIFSHeader(is)) {		//Excel2003及以下版本
					wb = new HSSFWorkbook(is);
				}else if (POIXMLDocument.hasOOXMLHeader(is)) {		//Excel2007及以上版本
					wb = new XSSFWorkbook(is);	
				}else{
					throw new IllegalArgumentException("你的Excel版本目前poi无法解析!");					
				}
			}
		return wb;
	}

方法二:根据wookbook和临时IP数组,获得IP列表

public Map<String, String> getIpMap(Workbook workbook,String[] IpTemp){
		Map<String,String> ipMap = new HashMap<String, String>();
		String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."		//正则 验证IP地址
            			+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            			+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            			+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
		StringBuilder ipString=new StringBuilder();				//存放所有合法的IP地址
		StringBuilder noIpString=new StringBuilder();				//存放所有不合法的IP地址
		Sheet sheet = null;	
		Cell cell = null;
		Row row = null;
		String resu = "";
		for (int k = 0; k < workbook.getNumberOfSheets(); k++) {		//遍历工作薄有的所有的表
			sheet = workbook.getSheetAt(k);

			try {								//如果是空表,直接遍历下一张表格
				sheet.getFirstRowNum();					
			} catch (Exception e) {
				continue;
			}
			for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {			//遍历表格,从第一个非空行到最后一个非空行
				 row=  sheet.getRow(i); 
				 try {
					 for (int j = row.getFirstCellNum(); j <row.getLastCellNum(); j++) {	//遍历行,从第一个非空单元格到最后一个非空														 单元格
							cell = row.getCell(j);
							
							if (cell.toString().matches(regex)) {			// 利用正则验证IP地址
								ipMap.put(cell.toString(), cell.toString());	//如果是合法的IP地址,就将其放到Map里
							}else{
								noIpString.append(",").append(cell.toString());	//否则添加到noIpString中
							}
							
					}
				 } catch (NullPointerException e) {						//当遇到空行时,跳过此行遍历下一行
					continue;
				 }
				 
			}
		}
		
		for (int i = 0; i < IpTemp.length; i++) {		
			ipMap.put(IpTemp[i], IpTemp[i]);
		}
		//取出Map里的value存放在一个集合里,并使用迭代器遍历集合取出所有的value
		Collection<String> ips = ipMap.values();	
		Iterator<String> iterator = ips.iterator();	
		while (iterator.hasNext()) {
			String ip = iterator.next();
			ipString.append(",").append(ip);
		}
		ipMap.put("ipString", ipString.toString().substring(1));
		if (noIpString.toString().length()!=0) {
			ipMap.put("noIpString", noIpString.toString().substring(1));
		}
		return ipMap;
	}


 

在编写过程中遇到两个问题:

问题一:The supplied data appears to be in the office 2007+XML , POI only supports OLE2 office document.

因为项目有现有的 POI包无法解析office 2007及其以上版本的Excel,所以只要导入新版的支持2007及以上版本的POI就可以了,我在项目中用的是POI 3.9 

需要导入的jar包有三个:poi-3.9-20121203.jar    poi-ooxml-3.9-20121203.jar   poi-ooxml-schemas-3.9-20121203.jar 

已上传到资源中,地址 http://download.csdn.net/detail/zdx1515888659/5508165

问题二:IncompatibleClassChangeError Class org.apache.poi.hssf.usermodel.HSSFWorkbook does not impliment the requested interfaceora.apache.poi.ss.usermodel.Workbook.

这是因为在删除之前版本的POI时,没有删除干净而导致的,应该先在Web项目的properties中的旧包remove掉,再去lib中将多余的包删除了,这样才能彻底的删除旧版本的jar包。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值