代码之家  ›  专栏  ›  技术社区  ›  posdef

要使用apache poi从Excel文件中获取列吗?

  •  15
  • posdef  · 技术社区  · 14 年前

    为了进行一些统计分析,我需要在Excel工作表的列中提取值。我一直在使用ApachePoi包从Excel文件中读取数据,当需要遍历行时,它可以正常工作。但是,我在API中找不到任何关于获取列的信息。( link text )也不是通过谷歌搜索。

    因为我需要获取不同列的最大值和最小值,并使用这些值生成随机数,所以在不提取单个列的情况下,唯一的另一个选项是迭代行和列以获取值,并逐个进行比较,这听起来并不是很省时。

    关于如何解决这个问题有什么想法吗?

    谢谢,

    3 回复  |  直到 6 年前
        1
  •  18
  •   Gagravarr    13 年前

    Excel文件是基于行而不是基于列的,因此获取列中所有值的唯一方法是依次查看每一行。因为列中的单元格没有存储在一起,所以无法更快地到达列。

    您的代码可能需要类似于:

    List<Double> values = new ArrayList<Double>();
    for(Row r : sheet) {
       Cell c = r.getCell(columnNumber);
       if(c != null) {
          if(c.getCellType() == Cell.CELL_TYPE_NUMERIC) {
             valuesadd(c.getNumericCellValue());
          } else if(c.getCellType() == Cell.CELL_TYPE_FORMULA && c.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) {
             valuesadd(c.getNumericCellValue());
          }
       }
    }
    

    然后将给出该列中的所有数值单元格值。

        2
  •  0
  •   Community Fabien Hure    7 年前

    我知道这是一个古老的问题,但我有和现在相同的问题,必须以不同的方式解决。

    我的代码不容易被修改,而且会增加很多不必要的复杂性。因此,我决定更改Excel工作表,而不是像下面解释的那样反转列和行:( http://www.howtogeek.com/howto/12366/ )

    您也可以通过如下所示的vba来反转它:

    Convert row with columns of data into column with multiple rows in Excel 2007

    希望它能帮助别人

        3
  •  0
  •   qwerty    6 年前

    只是想添加,以防您的文件中有标题,并且您不确定列索引,但想为例如选择特定标题(列名)下的列,您可以尝试类似的操作

        for(Row r : datatypeSheet) 
                {
                    Iterator<Cell> headerIterator = r.cellIterator();
                    Cell header = null;
                    // table header row
                    if(r.getRowNum() == 0)
                    {
                        //  getting specific column's index
    
                        while(headerIterator.hasNext())
                        {
                            header = headerIterator.next();
                            if(header.getStringCellValue().equalsIgnoreCase("column1Index"))
                            {
                                column1Index = header.getColumnIndex();
                            }
                        }
                    }
                    else
                    {
                        Cell column1Cells = r.getCell(column1);
    
                        if(column1Cells != null) 
                        {
                            if(column1Cells.getCellType() == Cell.CELL_TYPE_NUMERIC) 
                            {
    // adding to a list
                                column1Data.add(column1Cells.getNumericCellValue());
                            }
                            else if(column1Cells.getCellType() == Cell.CELL_TYPE_FORMULA && column1Cells.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) 
                            {
    // adding to a list
                                column1Data.add(column1Cells.getNumericCellValue());
                            }
                        }
    
                    }    
                }