无法动态设置HSSFCell对象的值

时间:2013-11-12 06:31:19

标签: java excel apache-poi hssf

我正在尝试使用Apache POI将数据从我的jsp导出到excel。我需要的列数取决于两个参数,因此,我通过查询获取它。

对于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 ");

但是,我得到的outtpu是

 A | B |  |  | DH3 | C 

因此,只在单元格中设置了最后一个值,而前一个值不是。任何人都可以提出错误的建议吗?

1 个答案:

答案 0 :(得分:2)

你的问题是你正在创建3个DH单元格,但只保留对最后一个单元格的引用,因此会覆盖它3次

此位创建3列(或设置多少列):

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

但是如你所见,只保留最后一个。然后当你这样做:

  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放入一个常量,因为你在任何地方都使用它,当你需要在开始时添加另一列时,它会更新...