0

Apache POI を使用して、jsp から Excel にデータをエクスポートしようとしています。必要な列の数は 2 つのパラメーターに依存するため、クエリを使用してフェッチします。

EXの場合:必要な動的列の数= 3の場合、出力は次のようになります。

 A | B | DH1 | DH2 | DH3 | C

ここで、A、B、C = 静的列ヘッダー。

DH = 動的列ヘッダー (クエリから取得)

これを行うには、最初に A、B、C を設定してから、必要な DH 列の数を見つけます。次に、DH 列を生成します。その後、各 DH 列に必要な値を見つけ、その値を Arraylist に格納してから、Arraylist を走査して値を設定します。

ここにコード

            HSSFCell c1= row.createCell(0);
            HSSFCell c2= row.createCell(1);

           HSSFCell cellObject = null;

          oRecordMetaInfo = getNoofDynamicColumns();
          NoofColumns = oRecordMetaInfo.getRecordCount();

                    for(int i = 2; i < NoofColumns + 2; i++)
        {
            cellObject =     row.createCell((int) i);
        }

           HSSFCell c3 = row.createCell((int) (NoofColumns + 2));


          c1.setCellValue(" A ");
          c2.setCellValue(" B ");

         Array1 = new ArrayList();

        Array1 = dao.getDynamicColumnValues();


     If(Array1.size != 0)
    {  
      QueryRow oRow = null;
        Iterator oIt = null;
       oIt = Array1.iterator();

       while (oIt.hasNext()) {
            oRow = (QueryRow) oIt.next();
            oRow.get("DYNAMIC_VALUE");

           cellObject.setCellValue(oRow.get("DYNAMIC_VALUE").getString());
          }
        }

          c3.setCellValue(" C ");

しかし、私が得る出力は

 A | B |  |  | DH3 | C 

したがって、最後の値のみがセルに設定され、前の値は設定されません。誰が何が悪いのか提案できますか?

4

1 に答える 1

2

あなたの問題は、3 つの DH セルを作成しているが、最後のセルへの参照のみを保持しているため、3 回上書きすることです。

このビットは、3 つの列を作成します (または、セットアップのために多くの列を作成します)。

    for(int i = 2; i < NoofColumns + 2; i++)
    {
        cellObject =     row.createCell((int) i);
    }

しかし、ご覧のとおり、最後の 1 つだけが保持されます。次に、次のことを行います。

  while (oIt.hasNext()) {
        oRow = (QueryRow) oIt.next();
        oRow.get("DYNAMIC_VALUE");

       cellObject.setCellValue(oRow.get("DYNAMIC_VALUE").getString());
  }

同じ最後のセルを上書きし続けます

ロジックを変更して、毎回正しいセルをフェッチする必要があります。

  int cellNumber = 2;
  while (oIt.hasNext()) {
        oRow = (QueryRow) oIt.next();
        oRow.get("DYNAMIC_VALUE");

       cellObject = row.getCell(cellNumber);
       cellObject.setCellValue(oRow.get("DYNAMIC_VALUE").getString());
       cellNumber++;
  }

または、セルを作成し、それらを並列に反復する配列に格納するか、そのようなものにします。また、それ2を定数に入れることを検討してください。どこでも使用でき、後で最初に別の列を追加する必要があるときに更新するのが面倒になります...

于 2013-11-12T11:17:20.380 に答える