POI通过事件解析Excel,空单元格问题 本帖最后由 zhangjiangfang 于 2012-10-29 14:14:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private List<Map> parseworkbookVoucher(HSSFWorkbook workbook){ //存放凭证主表 List<Map> VoucherList=new ArrayList<Map>(); int columnNum = 0; Sheet sheet = workbook.getSheetAt(0); if(sheet.getRow(0)!=null){ columnNum = sheet.getRow(0).getLastCellNum()-sheet.getRow(0).getFirstCellNum(); } Row rowkey=sheet.getRow(0); if(columnNum>1){ for (int j = 2; j <= sheet.getLastRowNum(); j++) { Row row=sheet.getRow(j); Map<String, Object> Vouchermap =new HashMap<String, Object>(); for(int i=0;i<columnNum;i++){ Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK); Cell cellkey = rowkey.getCell(i); switch(cell.getCellType()){ case Cell.CELL_TYPE_BLANK: Vouchermap.put(cellkey.getStringCellValue().trim(), ""); break; case Cell.CELL_TYPE_BOOLEAN: Vouchermap.put(cellkey.getStringCellValue().trim(), ""); break; case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)){ //System.out.println("日期:"+cell.getDateCellValue()); Vouchermap.put(cellkey.getStringCellValue().trim(), dateformate(cell.getDateCellValue())); }else{ cell.setCellType(Cell.CELL_TYPE_STRING); //System.out.println("*********"+cellkey.getStringCellValue()); //System.out.println("*********"+cell.getStringCellValue()); //DecimalFormat df = new DecimalFormat("###0.00"); Vouchermap.put(cellkey.getStringCellValue().trim(), cell.getStringCellValue()); } break; case Cell.CELL_TYPE_STRING: Vouchermap.put(cellkey.getStringCellValue().trim(), cell.getStringCellValue()); break; case Cell.CELL_TYPE_ERROR: Vouchermap.put(cellkey.getStringCellValue().trim(), ""); break; } } //Vouchermap.put("Table", "Co_Relationdetails1"); if(null!=Vouchermap.get("cOrgnID")&&!Vouchermap.get("cOrgnID").equals("")){ VoucherList.add(Vouchermap); } } } for (int m = 0; m < VoucherList.size(); m++) { System.out.println(VoucherList.size()); Map map=VoucherList.get(m); System.out.println("模板数据:"+map); } return VoucherList; }换一个遍历方式,楼主的遍历可能涉及到一些迭代器,其中可能进行了一些处理,具体细节不太了解 我也很想100分都给你,可是你的做法是基于UserModel解析的,我用的是事件解析,因为数据量比较大,没办法 楼主能否说下事件解析Excel是什么意思?基于事件?what? Event,就是一个先把Excel弄成DOM树的结构,然后用SAX解析,你那种UserModle的解析方式是另外一种常用的方式,但是碰上数据量比较大的情况,就会内存溢出,参看这个博客http://blog.csdn.net/goodkuang2012/article/details/7350985 单元格是否为空,可以根据cell.getCellType() == HSSFCell.CELL_TYPE_BLANK来判断 poi好久没用了都忘了,应该是有Cell对象的,poi操作的对象不就是sheet row cell 这样的 那是前面说的UserModel的解析方式,那种方式的确有,操作简便,就是很容易内存溢出 昨天自己解决了,结贴attributes.getValue("r"); attributes.getValue("r"); 在什么地方判断啊? 我也遇到空格的问题了 这个能读excel中的“真空”值吗? DefaultHandle接口里面仔细找下,有一个方法就可以满足你。。加油,另外03頒的也支持时间驱动。。 推荐JAVA导航网址 纠结,蛋疼!!! el表达式中如何获得list的大小? 关于EJB3 ejb-jar.xml的问题 apache+tomcat整合问题? 网站换托管 要换IP 我们服务器是apache和tomcate 都需要改什么地方? Iterator的实现??请高手指点迷津 各位仁兄,求助,急阿!万分感谢! 我用java画直线,怎样才能使得线条粗些? 学了一段时间的jdk和jdbc了,现在学j2ee,怎么开始阿? JNDI是干嘛的啊,怎么用啊 iBatis 插入xmltype型字段,报ORA-01461错
private List<Map> parseworkbookVoucher(HSSFWorkbook workbook){
//存放凭证主表
List<Map> VoucherList=new ArrayList<Map>();
int columnNum = 0;
Sheet sheet = workbook.getSheetAt(0);
if(sheet.getRow(0)!=null){
columnNum = sheet.getRow(0).getLastCellNum()-sheet.getRow(0).getFirstCellNum();
}
Row rowkey=sheet.getRow(0);
if(columnNum>1){
for (int j = 2; j <= sheet.getLastRowNum(); j++) {
Row row=sheet.getRow(j);
Map<String, Object> Vouchermap =new HashMap<String, Object>();
for(int i=0;i<columnNum;i++){
Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);
Cell cellkey = rowkey.getCell(i);
switch(cell.getCellType()){
case Cell.CELL_TYPE_BLANK:
Vouchermap.put(cellkey.getStringCellValue().trim(), "");
break;
case Cell.CELL_TYPE_BOOLEAN:
Vouchermap.put(cellkey.getStringCellValue().trim(), "");
break;
case Cell.CELL_TYPE_NUMERIC:
if(DateUtil.isCellDateFormatted(cell)){
//System.out.println("日期:"+cell.getDateCellValue());
Vouchermap.put(cellkey.getStringCellValue().trim(), dateformate(cell.getDateCellValue()));
}else{
cell.setCellType(Cell.CELL_TYPE_STRING);
//System.out.println("*********"+cellkey.getStringCellValue());
//System.out.println("*********"+cell.getStringCellValue());
//DecimalFormat df = new DecimalFormat("###0.00");
Vouchermap.put(cellkey.getStringCellValue().trim(), cell.getStringCellValue());
}
break;
case Cell.CELL_TYPE_STRING:
Vouchermap.put(cellkey.getStringCellValue().trim(), cell.getStringCellValue());
break;
case Cell.CELL_TYPE_ERROR:
Vouchermap.put(cellkey.getStringCellValue().trim(), "");
break;
}
}
//Vouchermap.put("Table", "Co_Relationdetails1");
if(null!=Vouchermap.get("cOrgnID")&&!Vouchermap.get("cOrgnID").equals("")){
VoucherList.add(Vouchermap);
}
}
}
for (int m = 0; m < VoucherList.size(); m++) {
System.out.println(VoucherList.size());
Map map=VoucherList.get(m);
System.out.println("模板数据:"+map);
}
return VoucherList;
}换一个遍历方式,楼主的遍历可能涉及到一些迭代器,其中可能进行了一些处理,具体细节不太了解
基于事件?what?
attributes.getValue("r");