2015-04-16 14 views
8

Mam plik programu Excel w formacie .xlsx. Zapisałem dane, łącząc komórki, tworząc różne kolumny. Czytam plik Excel przez aplikację internetową Java i zapisuję jej dane do bazy danych (MySQL). Ale gdy czytam z scalonych komórek, otrzymuję wartości null wraz z tym, co jest przechowywane w kolumnach, jak również w nagłówkach. Używam Apache POI. Mój kod to:Jak odczytać z scalonych komórek programu Excel w Javie przy użyciu 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(); 
      } 
     }         

    } 

    } 

} 

Szukałem odpowiedzi w Internecie, ale nie znalazłem nic istotnego.

+2

Połączone komórki są źle złe i nie powinny być dozwolone. Unikaj ich. Program Excel zwykle zapisuje zawartość scalonego zakresu w lewej górnej komórce tego zakresu. Wszystkie inne komórki zwracają 0. – teylyn

+0

spróbuj tego http://stackoverflow.com/a/27799327/624003 – Sankumarsingh

+0

Wiem, ale format excel jest tworzony przez wydziały uczelni. Nasz projekt polega po prostu na pobieraniu od nich informacji i aktualizowaniu bazy danych. Osobiście uniknęłbym tych. – Saber

Odpowiedz

6

Poniższy kod fragmentu może pomóc.

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

Dzięki, ale zdecydowałem się użyć niezamkniętych komórek w programie Excel. Inni, w tym ci tutaj, zalecili, aby nie używać scalonych plików Excela do przesyłania danych do aplikacji. – Saber

+2

@Deepika Co jeśli w pliku nie ma scalonych kolonii, kod zadziała – Labeo

Powiązane problemy