2016-06-29 64 views
0

我想從使用JSP頁面中的Apache POI的輸入Excel表生成一個HTML表。我設法編寫了從Excel中提取數據的部分,並將其顯示爲HTML表格,但問題是一些主要ID已在幾行中重複,但在其他行中有不同的值。例(2個約翰斯不同姓):在JSP表中合併重複的行

out.println("<table>"); 
while (rowIter.hasNext()) 
{ 
    row =(HSSFRow)rowIter.next(); 

     input_fname = row.getCell(0); 
     input_lname = row.getCell(1); 
     input_age = row.getCell(2); 

     fname = input_fname.getRichStringCellValue().getString(); 
     lname = input_lname.getRichStringCellValue().getString(); 
     age = input_age.getRichStringCellValue().getString(); 

     out.println("<tr>"); 
     out.println("<td>"+fname+"</td>"); 
     out.println("<td>"+lname+"</td>"); 
     out.println("<td>"+age+"</td>"); 
     out.println("</tr>"); 

    } 
} 
out.println("</table>"); 

請任何人告訴我我怎麼能根據主ID合併重複的行,名字爲:

<table> 
<tr> 
<td>Jill</td> 
<td>Smith</td> 
<td>50</td> 
</tr> 
<tr> 
<td>John</td> 
<td>Jackson</td> 
<td>94</td> 
</tr> 
<tr> 
<td>John</td> 
<td>Doe</td> 
<td>80</td> 
</tr> 
</table> 

生成表的代碼如下:

<table> 
<tr> 
<td>Jill</td> 
<td>Smith</td> 
<td>50</td> 
</tr> 
<tr> 
<td rowspan="2">John</td> 
<td>Jackson</td> 
<td>94</td> 
</tr> 
<tr> 
<td>Doe</td> 
<td>80</td> 
</tr> 
</table> 

我試圖尋找類似的問題,但我找不到我的問題的任何解決方案,我在Javascript和JQuery(也許這就是問題所在)相當初學者。任何建議,非常感謝。提前致謝!

回答

2

你是問錯了問題。首先要正確編寫HTML,而不是試圖在HTML上進行一些合併,這樣做會不會容易得多?因此,在條目上循環並將它們放入一些合適的數據結構中,例如,一個由fname鍵入的地圖和一個列表作爲值。 Person類是一個容納數據的簡單bean。

Map<String, List<Person>> people = new TreeMap<String, List<Person>>(); 

while (rowIter.hasNext()) 
{ 
    row =(HSSFRow)rowIter.next(); 

     input_fname = row.getCell(0); 
     input_lname = row.getCell(1); 
     input_age = row.getCell(2); 

     fname = input_fname.getRichStringCellValue().getString(); 
     lname = input_lname.getRichStringCellValue().getString(); 
     age = input_age.getRichStringCellValue().getString(); 

     Person person = new Person(fname, lname, age); 

     if(! people.containsKey(person.fname)){ 
      people.put(person.fname, new ArrayList<Person>()); 
     } 

     people.get(person.fname).add(person); 
    } 
} 

然後對這些數據結構循環並寫入HTML:

for(String key : people.keySet()){ 
    List<Person> persons = people.get(key)); 
    int rowSpan = persons.size(); 

    //write the HTML accordingly. 
} 
+0

非常感謝。這是非常有用的..如果你不介意,我想澄清另一件事。我假設List(個人)將有幾個lname映射到一個fname。我如何迭代列表(人員)來檢索多個lname。我試過這樣的'for(String lastname:people.get(key).lname){ \t \t System.Out.println(「Name:」+ key +「Lastname:」+ lastname); \t}' – User420

1

您可以:

  • 在你的後端代碼打印的名字時,例如加個班out.println("<td class="fname">"+fname+"</td>");
  • ,然後使用jQuery

    var last_selected_name = ""; 
    
    /* Get all the first names cells */ 
    jQuery('td.fname').each(function(i,obj){ 
    current_name = jQuery(obj).text(); 
    
    /* check for repeated names */ 
    if (current_name == last_selected_name) 
    { 
        jQuery("td.fname:contains('"+current_name+"')").each(function(index,object){ 
    
         if (index == 0) 
         { 
          /* check if already has rowspan attribtue */ 
          row_span = jQuery(object).attr('rowspan')?jQuery(object).attr('rowspan'):1; 
    
          /* add one */ 
          row_span++; 
    
          /* include the new rowspan number */ 
          jQuery(object).attr('rowspan',row_span) 
    
         } 
         else 
         { 
          /* delete the other first name cells */ 
          jQuery(object).remove(); 
         } 
        }) 
    } 
    last_selected_name = current_name; 
    }) 
    
+0

我已經編輯它。 – Fredster

+0

非常感謝。如果你不介意,我可以問我如何比較多個重複的值(fname&lname)而不是一個值(fname)。在此先感謝 – User420