2016-09-30 141 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