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

时间:2022-01-13 05:06:44

    最近在做给一个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包。