2015-04-16 8 views
8

Ich habe eine Excel-Datei im .xlsx-Format. Ich habe Daten gespeichert, indem ich Zellen zu verschiedenen Spalten zusammengeführt habe. Ich lese die Excel-Datei über eine Java-Webanwendung und speichere ihre Daten in einer Datenbank (MySQL). Aber wenn ich aus verbundenen Zellen lese, bekomme ich NULL-Werte zusammen mit dem, was in den Spalten sowie den Headern gespeichert ist. Ich benutze Apache POI. Mein Code ist:Wie liest man aus gemischten Excel-Zellen in Java mit Apache POI?

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(); 
      } 
     }         

    } 

    } 

} 

Ich suchte nach Antworten im Netz, aber fand nichts relevantes.

+2

Zusammengefasste Zellen sind schlecht schlecht schlecht und sollten nicht erlaubt sein. Vermeide sie. Excel speichert normalerweise den Inhalt eines zusammengeführten Bereichs in der oberen linken Zelle dieses Bereichs. Alle anderen Zellen geben 0 zurück. – teylyn

+0

versuchen Sie es http://stackoverflow.com/a/27799327/624003 – Sankumarsingh

+0

Ich weiß, aber das Format für das Excel wird von College-Abteilungen gemacht. Unser Projekt besteht einfach darin, Informationen von ihnen zu erhalten und die Datenbank zu aktualisieren. Ich persönlich hätte diese vermieden. – Saber

Antwort

6

Folgende Code-Snippets könnten helfen.

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

Danke, aber ich habe beschlossen, nicht zusammengezählte Zellen im Excel zu verwenden. Andere, einschließlich der hier genannten, haben empfohlen, keine Excel-Dateien aus verbundenen Zellen zu verwenden, um Daten in Anwendungen einzugeben. – Saber

+2

@Deepika Was ist, wenn es keine zusammengesetzten colomns in der Datei gibt, funktioniert der Code – Labeo