本帖最后由 zhangjiangfang 于 2012-10-29 14:14:19 编辑

解决方案 »

  1.   


    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; 
    }换一个遍历方式,楼主的遍历可能涉及到一些迭代器,其中可能进行了一些处理,具体细节不太了解
      

  2.   

    我也很想100分都给你,可是你的做法是基于UserModel解析的,我用的是事件解析,因为数据量比较大,没办法
      

  3.   

    楼主能否说下事件解析Excel是什么意思?
    基于事件?what?
      

  4.   

    Event,就是一个先把Excel弄成DOM树的结构,然后用SAX解析,你那种UserModle的解析方式是另外一种常用的方式,但是碰上数据量比较大的情况,就会内存溢出,参看这个博客http://blog.csdn.net/goodkuang2012/article/details/7350985
      

  5.   

    单元格是否为空,可以根据cell.getCellType() == HSSFCell.CELL_TYPE_BLANK来判断
      

  6.   

    poi好久没用了都忘了,应该是有Cell对象的,poi操作的对象不就是sheet  row cell 这样的
      

  7.   

    那是前面说的UserModel的解析方式,那种方式的确有,操作简便,就是很容易内存溢出
      

  8.   

    昨天自己解决了,结贴
    attributes.getValue("r");
      

  9.   

    attributes.getValue("r");  在什么地方判断啊? 我也遇到空格的问题了
      

  10.   

    这个能读excel中的“真空”值吗?
      

  11.   

    DefaultHandle接口里面仔细找下,有一个方法就可以满足你。。加油,另外03頒的也支持时间驱动。。