2013-04-17 39 views
0

我使用POI從託管bean生成Excel電子表格。這是我的學生豆:如何迭代bean的屬性以填充電子表格的單元格

package edu.phc.students.model; 

public class Student { 
private String m_firstName; 
private String m_lastName; 
private String m_id; 

public Student() {} 

public Student(
String firstName, 
String lastName, 
String id, 
) 
{ 
     m_firstName=firstName; 
     m_lastName=lastName; 
     m_id=id; 

} 

public String getid() { 
     return m_id; 
} 

public void setid(String newid) { 
     m_id=newid; 
} 

public String getFirstname() { 
     return m_firstName; 
} 

public void setFirstname(String newFirstName) { 
     m_firstName=newFirstName; 
} 

public String getLastname() { 
     return m_lastName; 
} 

public void setLastname(String newLastname) { 
     m_lastName=newLastname; 
}  

} 

這是最終代碼(SSJS)的一小部分。

var students:java.util.List = studentlist.getStudents(); 
var iterator:java.util.Iterator = students.iterator(); 
var count = 0; 
while (iterator.hasNext()) { 
     var student:edu.phc.students.model.Student = iterator.next(); 
     count++; 
     var row:HSSFRow = sheet1.createRow(count); 
     for(f = 0 ; f <= fieldList.length-1 ; f++){//column List 
      // output student's data into Excel row 
      row.createCell((java.lang.Integer)(f)).setCellValue(student.getid());    
     } 
} 

這很好用。它使用列名生成電子表格,並將學生ID插入每個單元格(對於迭代器返回的每一行)。

但是,我想遍歷學生bean的可用屬性 - ID,姓氏,名字等,並填充電子表格的單元格。我怎麼做?我可以通過索引引用student bean的屬性嗎?

感謝,

回答

1

你可以使用java.lang.reflection。這裏是你的學生類的所有區域的例子:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 

    <xp:repeat id="repeat1" rows="30" var="field"> 
     <xp:this.value><![CDATA[#{javascript: 
     var student = new edu.phc.students.model.Student(); 
     student.getClass().getDeclaredFields()}]]> 
     </xp:this.value> 
     <xp:label value="#{field.name}" id="labelFieldName" /><xp:br /> 
    </xp:repeat> 
</xp:view> 

輸出看起來是這樣的:

m_firstName 
m_lastName 
m_id 

請檢查documentation for other options

編輯:

此示例迭代的方法和返回一個返回字符串的所有方法的當前值:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 

<xp:repeat id="repeat1" rows="30" var="method"> 
    <xp:this.value><![CDATA[#{javascript: 
     var student = new edu.phc.students.model.Student(); 
     student.setid("A"); 
     student.setLastname("Meiser"); 
     student.setFirstname("Hans"); 
     student.getClass().getDeclaredMethods()}]]> 
    </xp:this.value> 
    <xp:label id="label1"> 
     <xp:this.value> 
      <![CDATA[#{javascript: 
       if(method.getReturnType().getSimpleName() == 'String') 
        return method.invoke(student, null);}]]> 
     </xp:this.value> 
    </xp:label> 
    <xp:br /> 
</xp:repeat> 

</xp:view> 

這將產生下面的輸出:

A 

Hans 

Meiser 
+0

感謝您回覆斯文。我不確定你的答案是否符合我的需求。我正在尋找一種方法來獲取每個學生的每個屬性的值,而不用按名稱實際引用屬性,所以我不必爲每個屬性鍵入一行,如下所示:row.createCell((java。 。lang.Integer)(0))setCellValue(student.getid()); ((java.lang.Integer)(1))。setCellValue(student.getFirstname()); ((java.lang.Integer)(2))。setCellValue(student.getLastname()); –

+0

@DanSoares:我又增加了另一個例子 –

+0

Sven,謝謝你的例子。我結束了創建在我的學生豆的方法(的getProperty),我然後引用如下:關於(F = 0;˚F<= fieldList.length-1;˚F++){//列列表\t \t \t \t \t \t \t \t \t var itemval = student.getProperty((java.lang。整數)(F)); \t \t \t \t \t如果(itemval === NULL){ \t \t \t \t \t //什麼也不做 \t \t \t \t \t}其他{\t \t \t \t \t \t \t \t \t java.lang.System中。 out.println(「Item value:」+ itemval); ((java.lang.Integer)(f))。setCellValue(itemval);()方法返回一個數組,並返回一個數組。 \t \t \t \t \t} \t \t \t}非常感謝Andrejus Chaliapinas從IBM的XPages團隊解決方案。 –

相關問題