2016-09-30 136 views
0

enter image description here讀取Excel使用Apache POI - 是HashMap,ArrayList的

嗨,

我試圖讀取使用列標題在Excel中(使用Java)列值。如圖所示,假設我想要讀取標題「城市」,列下的所有後續單元格並顯示它們。我將如何做到這一點?

在互聯網上看到的例子,我發現大部分的例子迭代使用遍歷行的迭代器。

假設我有一個密鑰的hashmap作爲excel的頭文件和存儲在ArrayList中的後續值。類似於

HashMap<String, ArrayList<String>> hashmap = 
       new HashMap<String, ArrayList<String>>(); 

我該如何繼續?任何人都可以幫助我的代碼和邏輯?

請不要將此標記爲重複,我已經嘗試過在stackoverflow和互聯網上搜索,但其中大多數使用該行迭代。

+0

不清楚問題出在哪裏 在這兒。只需遍歷行和[getCell(4)](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.html#getCell(int)),它是列E '從每一行開始。 –

+0

我想使它通用。不是特定的行或列。對於特定的列標題,我想提取所有單元格值。如果你可以用一些代碼來幫助我,那就太好了。 –

回答

1

沒有辦法直接讀取列中的所有單元格而不迭代行,因爲這是數據存儲在Excel表格中(行中,而不是列中)的方式。解決方法是將行和列轉置(如圖所示),如here所示,然後遍歷行以獲取數據,如Hashmap所示,正如您在問題中指出的那樣。

+0

感謝您的信息。我們可以根據列標題名稱檢索所有單元格,而不是調換行和列,而不是調換行和列。 –

+0

我不知道有什麼其他的方式,至少對於CSV或excel格式的表格,由於存儲數據的方式(逐行)而施加的基本限制,在他們中。從一個單元格到下一個單元格有一個直接指針(排序),但不存在跨越不同行的列中單元格的這種聯繫。想象一下,以這種方式 - 等長的線被水平放置在桌子上,一個在另一個下面(行)。您可以遍歷線程的長度,但不能從一個線程上的一個點跳到下一個線程上的一個點! –

0

首先,你會讀第1行後,你可以得到所有的列值,下面我給怎麼看第一行

public void readFirstRow(String filename) 
{ 

    List<String> fieldsArrayList = new ArrayList<String>(); 

    try{ 

      FileInputStream myInput = new FileInputStream(new File(filename)); 

      Workbook workBook = null; 

      workBook = new HSSFWorkbook(myInput); 

      Sheet sheet = workBook.getSheetAt(0); 

      Row firstRow = sheet.getRow(0); 

      int length = firstRow.getLastCellNum(); 

      Cell cell = null; 

      for(int i = 0 ; i < length ; i++) 

       { 
        cell = firstRow.getCell(i); 

        fieldsArrayList.add(cell.toString()); 

       } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

讀取列值碼:

//你只要傳遞cityPostion和文件名

public void readColumnValues(int cityPosition,String fileName) 
{ 
    try 
    { 
     FileInputStream myInput = new FileInputStream(fileName); 

     Workbook workBook = null; 

     workBook = new HSSFWorkbook(myInput); 
     Sheet sheet = workBook.getSheetAt(0); 

     for (int i = 0 ; i <= sheet.getLastRowNum() ; i++) 
     { 
      Row row = sheet.getRow(i); 

      if (i > 0) //skip first row 
      { 

       Cell cityCell = row.getCell(cityPosition); 


       String cityNames  = cityCell.toString(); 
      } 

     } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

可能是它會幫助你...

+0

檢查空行和空單元,除非需要NullPointerExceptions。 – IceArdor

+0

感謝您的幫助。創建我自己的類 –

+0

@parthi: public void readFirstRow(String filename) \t {嘗試{FileInputStream myInput = new FileInputStream(new File(filename)); 工作簿workBook = null; workBook = new HSSFWorkbook(myInput); 工作表=工作簿。getSheetAt(0);行firstRow = sheet.getRow(0); int length = firstRow.getLastCellNum(); Cell cell = null; (int i = 0; i