繁体   English   中英

如何使用 Apache POI 从 Excel 文件中获取列?

[英]How to get columns from Excel files using Apache POI?

为了进行一些统计分析,我需要在 Excel 表的列中提取值。 我一直在使用 Apache POI package 从 Excel 文件中读取,当需要遍历行时它工作正常。 但是,我在 API (链接文本)和谷歌搜索中都找不到任何关于获取列的信息。

由于我需要获取不同列的最大值和最小值并使用这些值生成随机数,因此在不选取单个列的情况下,唯一的其他选择是迭代行和列以获取值并一一比较,这不会听起来不是那么省时。

关于如何解决这个问题的任何想法?

谢谢,

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

然后,它将为您提供该列中的所有数字单元格值。

我知道这是一个古老的问题,但我遇到了同样的问题,必须以不同的方式解决它。

我的代码不容易调整,并且会获得很多不必要的复杂性。 所以我决定改变excel表,而不是像这里解释的那样反转列和行:( http://www.howtogeek.com/howto/12366/

您也可以通过VBA反转它,如下所示:

将包含数据列的行转换为Excel 2007中具有多行的列

希望它可以帮助那里的人

只是想添加,如果你的文件中有标题并且你不确定列索引但是想要选择特定标题(列名)下的列,例如,你可以试试这样的东西

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

                }    
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM