2017-02-25 8 views
2

poiを使ってHashMapsをxlsxに変換する必要があります。Java HashMapをxlsxにエクスポート

enter image description here

しかし、私は表2ています:

TABLE1:シートDATA2のために私はそのようなものが必要ここでハッシュマップの私のリスト

enter image description here

です:

行= [{kol2 = s、kol1 = s}、{kol2 = bbbb、kol3 = bbbb、kol1 = aaaa}、{kol2 = BBBB、kol3 = BBBB、kol1 = AAAA}、{kol2 = BBBB、kol3 = BBBB、kol1 = AAAA}、{kol2 = S、kol1 = S}]}

ここに私のコードは次のとおり

  XSSFWorkbook workBook = new XSSFWorkbook(); 
      XSSFSheet sheet = workBook.createSheet("data"); 
      XSSFSheet sheet2 = workBook.createSheet("data2"); 
      int rowCount = 0; 
      int help = 1; 


       List<HashMap<String, Object>> rows = ((List<HashMap<String, Object>>) x); 
       int rowCount2 = 0; 
       int header = 1; 
       Row header2 = sheet2.createRow(0); 
       for (int i = 0; i < rows.size(); i++) { 
        int li = 0; 
        Row row2 = sheet2.createRow(++rowCount2); 
        HashMap<String, Object> row = rows.get(i); 
        int columnCount2 = 0; 

        for (HashMap.Entry<String, Object> subElement : row.entrySet()) { 

         if (subElement.getValue() != null) { 

          if (i == li) { 
           Cell cell = header2.createCell(header); 
           cell.setCellValue(subElement.getKey().toString()); 
           header++; 
          } 
          li++; 
          Cell cell2 = row2.createCell(++columnCount2); 
          cell2.setCellValue(subElement.getValue().toString()); 
         } 
        } 
       } 

誰かが助けることができますか?

答えて

1

のHashMapのentrySet

の繰り返し処理を行う第一の問題は、あなたがこの表示されますSet#iterator()方法のJavaDocを見てみるあなたのHashMap

for (HashMap.Entry<String, Object> subElement : row.entrySet()) { 
    // no guaranteed order 
} 

ののentrySetを反復していることである。

このセットの要素のイテレータを返します。 要素は特定の順序で返されません(このセットが保証を提供するいくつかのクラスのインスタンスでない限り)。

あり(例えばTreeSetなど)順序付けられて設定しているが、あなたはHashMapを使用しているので、あなたのentrySetも注文できません。

シートの列の順序がkol2-kol3-kol1であることに注意してください。あなたはそれがkol1-kol2-kol3になりたくないですか?

あなたはあなたの地図ではありません列のための空のセルを作成するために忘れている空の列

を作成していません。

if (subElement.getValue() != null) { 
    // there won't be an empty cell if you e.g. don't have kol2 in your rows Map, 
    // since this just skips your current value 
} 

あなたのようなもので終わる理由です:作成することでループ

内のヘッダー行を作成

kol2 kol3 kol1 
s    s  
bbbb bbbb aaaa 
... 

kol2 kol3 kol1 
s  s  
bbbb bbbb aaaa 
... 

の代わりに、ヘッダー行をループ内に配置すると、ソリューションがより多くなります必要以上に複雑です。ヘッダー行を作成し、Listのエントリにループするほうがはるかに簡単です。

if (i == li) { 
    Cell cell = header2.createCell(header); 
    cell.setCellValue(subElement.getKey().toString()); 
    header++; 
} 

あなたはループの外でこれをやっている場合は、私は(スタートのために)何かを思い付くでしょうliheader変数

推奨する解決方法

の必要がありませんこのように(私は、意図が何であるか、そしてあなたが理解する必要がある解決策のどの側面をより明確にするために、通常そこに置かないいくつかの追加のコメントを追加した):

XSSFSheet sheet2 = workBook.createSheet("data2"); 
    List<HashMap<String, Object>> rows = ((List<HashMap<String, Object>>) x); 

    List<String> headers = Arrays.asList("kol1", "kol2", "kol3"); 
    int currentRowNumber = 0; 

    // create header row 
    Row header = sheet2.createRow(currentRowNumber); 
    for (int i = 0; i < headers.size(); i++) { 
     Cell headerCell = header.createCell(i); 
     headerCell.setCellValue(headers.get(i)); 
    } 

    // create data rows (we loop over the rows List) 
    for (int i = 0; i < rows.size(); i++) { 
     HashMap<String, Object> row = rows.get(i); 

     // we neet to increment the rowNumber for the row in the sheet at the beginning of 
     // each row. entry 0 in the rows List is in sheetRow 1, entry 1 in sheetRow 2, etc. 
     currentRowNumber++; 
     Row sheetRow = sheet2.createRow(currentRowNumber); 

     // we can now loop over the columns inside the row loop (using the headers List) 
     // we create a Cell for each column, but only fill it if there is 
     for (int j = 0; j < headers.size(); j++) { 
      Cell cell = sheetRow.createCell(j); 

      // only fill the cell if we are having data in the row map for the current column 
      String currentColumnName = headers.get(j); 
      if (row.containsKey(currentColumnName)) { 
       cell.setCellValue(row.get(currentColumnName).toString()); 
      } 
     } 
    } 

異なる列の順序が必要な場合は、ヘッダーリストを変更するだけです。 Arrays.asList("kol2", "kol3", "kol1"))。

関連する問題