2015-04-16 10 views
8

.xlsx biçiminde bir Excel dosyası var. Çeşitli sütunlar oluşturmak için hücreleri birleştirerek veri depoladım. Bir Java web uygulaması aracılığıyla Excel dosyasını okuyorum ve verilerini bir veritabanına (MySQL) kaydediyorum. Ama birleştirilmiş hücrelerden okurken, sütunlarda ve başlıklarda saklananlarla birlikte null değerler alırım. Apache POI kullanıyorum. Benim kodum:Apache POI kullanarak Java'da Excel'in birleştirilmiş hücrelerinden nasıl okunur?

public static void excelToDBLogIN() { 

    FileInputStream file = null; 
    Boolean flag = true; 
    ArrayList<String> rows = new ArrayList<String>(); 
    try { 


     // here uploadFolder contains the path to the Login 3.xlsx file 

     file = new FileInputStream(new File(uploadFolder + "Login 3.xlsx")); 

     //Create Workbook instance holding reference to .xlsx file 
     XSSFWorkbook workbook = new XSSFWorkbook(file); 

     //Get first/desired sheet from the workbook 
     XSSFSheet sheet = workbook.getSheetAt(0); 

     //Iterate through each rows one by one 
     Iterator<Row> rowIterator = sheet.iterator(); 


     while (rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 

      //For each row, iterate through all the columns 
      Iterator<Cell> cellIterator = row.cellIterator(); 

      String tuple = ""; 
      while (cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 

       //Check the cell type and format accordingly 
       switch (cell.getCellType()) { 

         case Cell.CELL_TYPE_NUMERIC:        

         //int value = new BigDecimal(cell.getNumericCellValue()).setScale(0, RoundingMode.HALF_UP).intValue(); 
         //tuple = tuple + String.valueOf(value) + "+"; 

         DataFormatter objDefaultFormat = new DataFormatter();  

         String str = objDefaultFormat.formatCellValue(cell); 

         tuple = tuple + str + "+"; 

         break; 

        case Cell.CELL_TYPE_STRING: 

         tuple = tuple + cell.getStringCellValue() + "+"; 

         break; 

        case Cell.CELL_TYPE_BLANK:               

         tuple = tuple + "" + "+"; 

         break; 


       } 

      } 

      rows.add(tuple); 
      flag = true; 

     } 

    }  


    } catch (Exception e) { 

     e.printStackTrace(); 

    } finally { 

     if (file != null) { 

      try { 
       file.close(); 
       file = null; 
      } catch (Exception e) { 

       System.out.println("File closing operation failed"); 
       e.printStackTrace(); 
      } 
     }         

    } 

    } 

} 

Web'de yanıt aradım ancak alakalı bir şey bulamadım.

+2

Birleştirilen hücreler kötü kötüdür ve izin verilmemelidir. Onları kaçının. Excel, genellikle, bu aralığın sol üst hücresindeki birleştirilmiş aralığın içeriğini depolar. Diğer tüm hücreler 0. – teylyn

+0

bunu deneyin http://stackoverflow.com/a/27799327/624003 – Sankumarsingh

+0

Ben biliyorum ama excel için biçim üniversite bölümleri tarafından yapılmaktadır. Projemiz sadece onlardan bilgi almak ve veritabanını güncellemek içindir. Şahsen bunlardan uzak dururdum. – Saber

cevap

6

Aşağıdaki kod parçacığı kodu yardımcı olabilir.

while (rowIterator.hasNext()) { 
     Row row = rowIterator.next(); 

     //For each row, iterate through all the columns 
     Iterator<Cell> cellIterator = row.cellIterator(); 

     outer: 
     while (cellIterator.hasNext()) { 
      Cell cell = cellIterator.next(); 

      //will iterate over the Merged cells 
      for (int i = 0; i < sheet.getNumMergedRegions(); i++) { 
       CellRangeAddress region = sheet.getMergedRegion(i); //Region of merged cells 

       int colIndex = region.getFirstColumn(); //number of columns merged 
       int rowNum = region.getFirstRow();  //number of rows merged 
       //check first cell of the region 
       if (rowNum == cell.getRowIndex() && colIndex == cell.getColumnIndex()) { 
        System.out.println(sheet.getRow(rowNum).getCell(colIndex).getStringCellValue()); 
        continue outer; 
       } 
      } 
      //the data in merge cells is always present on the first cell. All other cells(in merged region) are considered blank 
      if (cell.getCellType() == Cell.CELL_TYPE_BLANK || cell == null) { 
       continue; 
      } 
      System.out.println(cell.getStringCellValue()); 
     } 
    } 
+1

Teşekkürler ama ben excel içinde unmerged hücreleri kullanmaya karar verdim. Buradakiler de dahil olmak üzere diğerleri, verileri uygulamaya aktarmak için birleştirilmiş hücreler excel dosyalarını kullanmamalarını tavsiye etmişlerdir. – Saber

+2

@Deepika Eğer dosyada birleştirilmiş colomns varsa kod çalışır – Labeo