web-dev-qa-db-ja.com

Apache POIを使用してExcelファイルから列を取得するには?

統計分析を行うには、Excelシートの列の値を抽出する必要があります。私はApachePOIパッケージを使用してExcelファイルから読み取りを行ってきましたが、行を反復処理する必要がある場合は正常に機能します。しかし、API( リンクテキスト )でもグーグル検索でも列を取得することについては何も見つかりませんでした。

異なる列の最大値と最小値を取得し、これらの値を使用して乱数を生成する必要があるため、個々の列を取得せずに、行と列を反復処理して値を取得し、1つずつ比較するしかありません。時間効率が良いとは言えません。

この問題に取り組む方法について何かアイデアはありますか?

ありがとう、

15
posdef

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

これで、その列のすべての数値セル値が表示されます。

18
Gagravarr

私はそれが古い質問であることを知っていますが、私は提示されたのと同じ問題を抱えていて、それを別の方法で解決しなければなりませんでした。

私のコードは簡単に適応させることができず、不必要に複雑になっていたでしょう。そこで、ここで説明するように列と行を逆にして、代わりにExcelシートを変更することにしました:( http://www.howtogeek.com/howto/12366/

次に示すように、VBAで逆にすることもできます。

Excel 2007でデータの列を含む行を複数の行を含む列に変換する

それが誰かを助けることを願っています

0
sgirardin

ファイルにヘッダーがあり、列インデックスがわからないが、特定のヘッダー(列名)の下にある列を選択したい場合は、次のように試すことができます。

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

                }    
            }
0
qwerty