2016-12-16 9 views
1

ExcelのデータをJavaのHashmapに抽出しようとしています。下図のようにJavaのデータフォーマットである8.この目的のために、私は、Apache POIライブラリとバージョンを使用しています:文字列データをExcelの列からハッシュマップに抽出する際の問題

Excel_Data.xlsx: 

    Title | Label A | Label B | Label C 

    Signal 1 | value A1 | value B1 | value C1 
    Signal 2 | value A2 | value B2 | value C2 
    Signal 3 | value A3 | value B3 | value C3 

ここに書かれたすべてのテキストはString形式で、ファイルに存在するいかなる数値型が存在しません

は、私が欲しい:

は、私がkeyvalueペアの形でハッシュマップデータを格納したいので、私の出力は次のようになります。

Expected Approach: 

Key  -> Value 

Signal 1 -> [value A1, value B1, value C1 ...] 
Signal 2 -> [value A2, value B2, value C2 ...] 
Signal 3 -> [value A3, value B3, value C3 ...] 

私は別の私が試したどのような信号

Expected_output.xlsx: 

Signal 1 | value A1 
     | value B1 
     | value C1 
Signal 2 | value A2 
     | value B2 
     | value C2 
Signal 3 | value A3 
     | value B3 
     | value C3 

のため、以下のファイルをExcelにこのデータを印刷するために実装するこのアプローチ:

私が試したこの解決策を見つけるオンラインが、その特異性のために、私は解決策を見いださなかった。私はまた、キーと値の両方がhashmapでExcelからStringというように抽出された解決策を見つけようとしましたが、あまり役に立ちませんでした。

私はコードの下に示すようにArrayListStringValuesからKeysを格納することを決定したアプローチを思い付いた:

// this function loads data from excel file stored in filestream variable 
public void storeData(){ 
    //this hashmap will be used to hold values of excel file in key:values format 
    HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
    String key = null; 
    ArrayList<String> value = null; 

    try { 
     // get workbook instance of xlsx file 
     HSSFWorkbook workbook = new HSSFWorkbook(open_excel_data); 

     //Get first sheet from the workbook 
     HSSFSheet sheet = workbook.getSheetAt(0); 

     //Iterate through each rows from first sheet 
     Iterator<Row> rowIterator = sheet.iterator(); 

     while(rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 

      // for each row, iterate through each columns 
      Iterator<Cell> cellIterator = row.cellIterator(); 

      while(cellIterator.hasNext()) 
      { 
       Cell cell = cellIterator.next(); 

       key = cell.getStringCellValue(); 

       value.add(cell.getStringCellValue()); // I cannot think of what should be here to store labels in correct format to arraylist 

       if(key != null && value != null) 
       { 
        map.put(key, value); 
        key = null; 
        value = null; 
       } 
      } 

     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

P.S.

  • そのシグナルのたくさんの巨大なファイルやラベル

  • それは、この機能が

  • あなたもすることができ、既に構築されたソフトウェアツールの一部になるようにJavaを使用して行う必要があり

    何かを念頭に置いてこのタスクを実行するための他の簡単なアプローチをお勧めします。

+0

あなたは(最初は、ループ内の各時間)ヌルとして配列リストを設定し、nullに()を呼び出すを追加しようとしています。それはNPEを引き起こすでしょう。それはあなたが直面している問題ですか? –

+0

また、最初の行をスキップしているわけではありません。作成したマップでは必要ではないようです。 –

+0

また、セルの値ごとにキーを設定しています。 –

答えて

1
while(rowIterator.hasNext()) { 

    Row row = rowIterator.next(); 

    // for each row, iterate through each columns 
    Iterator<Cell> cellIterator = row.cellIterator(); 
    key = null; 
    value = new ArrayList<String>();  

    while(cellIterator.hasNext()) { 

     Cell cell = cellIterator.next(); 
     int columnIndex = cell.getColumnIndex(); 

     if(columnIndex == 1) { 
      key = cell.getStringCellValue(); 
     } else { 
      value.add(cell.getStringCellValue()); 
     } 
    } 

    if(key != null && value != null) { 
     map.put(key, value); 
     key = null; 
     value = null; 
    } 
} 
+0

私は現在あなたのソリューションを試しています。私はこのアプローチがうまくいくはずだと思いますが、まずは簡単に試してみましょう。 – Dhruvify

+0

少し遅れてこの回答を受け入れることに申し訳ありません。私は週末内にコンピュータから離れていた。カラムインデックスが0から始まるので 'columnIndex == 1'を' columnIndex == 0'に変更しなければなりませんでした。コードの残りの部分は、 'key'と' values'構造体の構築に役立ちます。上記の質問の期待される出力セクション – Dhruvify

1

コードスニペットでは、決してcrea 「value」の空のArrayListを返します。各行に対して、空のArrayListを作成する必要があります。そうしないと、値を追加できません。さらに、行を繰り返し処理してセルを反復処理すると、各行の最初のセルにのみキーが含まれます。このように、キーと値は常に同じです。最初のセルエントリに設定された後は、そのキーを上書きしないでください。

+0

大丈夫です。 ArrayListについて指摘してくれてありがとう。もう一度試してみましょう。 – Dhruvify

2
// this function loads data from excel file stored in filestream variable 
    public HashMap<String, ArrayList<String>> storeData(String fileName) { 
     // this hashmap will be used to hold values of excel file in key:values 
     // format 
     HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
     String key = null; 
     ArrayList<String> value = null; 
     int keyIndex = 0; 
     try { 
      // get workbook instance of xlsx file 
      FileInputStream file = new FileInputStream(new File(fileName)); 
      HSSFWorkbook workbook = new HSSFWorkbook(file); 

      // Get first sheet from the workbook 
      HSSFSheet sheet = workbook.getSheetAt(0); 

      // Iterate through each rows from first sheet 
      Iterator<Row> rowIterator = sheet.iterator(); 

      while (rowIterator.hasNext()) { 
       Row row = rowIterator.next(); 
       key = null; 
       value = new ArrayList<String>(); 
       // for each row, iterate through each columns 
       Iterator<Cell> cellIterator = row.cellIterator(); 

       // To skip first row 
       if (row.getRowNum() == 0){ 
        continue; 
       } 

       while (cellIterator.hasNext()) { 
        Cell cell = cellIterator.next(); 
        cell.setCellType(Cell.CELL_TYPE_STRING); 
        if(cell.getColumnIndex() == keyIndex){ 
         key = cell.getStringCellValue(); 
        } else { 
         value.add(cell.getStringCellValue()); 
        } 

       } 

       if (key != null && value != null && value.size()>0) { 
        map.put(key, value); 
        key = null; 
        value = null; 
       } 

      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return map; 
    } 
+0

最初の行をスキップする方法を教えてくれてありがとう。必要に応じてこのソリューションを使用します。今のところ、私は最初の行をそのまま維持する必要があります。 – Dhruvify

関連する問題