2009-01-13 11 views
5

En ce moment, je me sers de ce exporter un répéteur (avec plusieurs répéteurs imbriqués) pour exceller:Exporter vers Excel à partir d'un répéteur?

protected void ExportToExcel(object sender, EventArgs e) 
{  
Response.Clear(); 
Response.Buffer = true; 
Response.AddHeader("content-disposition", "attachment;filename=finance.xls"); 
Response.Charset = ""; 
Response.ContentType = "application/vnd.ms-excel"; 
System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
rptMinistry.RenderControl(htmlWrite); 
Response.Write(stringWrite.ToString()); 
Response.End(); 
} 

Mais ce ne fait pas ce que je veux. Au contraire, il me donne html dans le fichier Excel (bien que les données sont là) ce que je reçois (chaque ligne est une cellule dans la feuille Excel):

<tr class="alt"> 
<td class='hidden'>LOR In Development</td> 
<td>MOD</td> 
<td>Air Force</td> 
<td class="size1"></td> 
<td>Hellfire (AGM-114) Follow On</td> 
<td>10-Mar-08</td> 
<td class="align_right ">$50,000,000.00</td> 
<td class="align_right hidden">$0.00</td> 
</tr> 

<tr class="alt"> 
<td class='hidden'>LOR In Development</td> 
<td>MOD</td> 
<td>Air Force</td> 
<td class="size1"></td> 
<td>Precision Strike Mi-17 (block 20)</td> 
<td>17-May-08</td> 
<td class="align_right ">$20,100,000.00</td> 
<td class="align_right hidden">$0.00</td> 
</tr> 

et ainsi de suite ... maintenant les données est correct, mais comment puis-je l'afficher correctement dans la feuille de calcul?

Répondre

12

Vous devez inclure tout cela dans les balises de table. Excel peut comprendre les structures de table HTML.

Essayez:

Response.Write("<table>"); 
Response.Write(stringWrite.ToString()); 
Response.Write("</table>"); 
+0

si simple ... ne peut pas croire que j'ai raté, merci! – naspinski

0

vous devez rendre le fichier de sortie un fichier HTML approprié, avec les balises html et le corps. Cela devrait mieux fonctionner.

0

ne pas répondre directement à votre question, mais étant donné que vous mon opinion

pour que peu de données, est à mon avis que vous devez utiliser un contrôle GridView, en prenant votre exemple, vous aurez besoin d'écrire quelque chose comme:

<asp:Repeater ID="rpt" runat="server" DataSourceID="ods"> 
    <HeaderTemplate> 
     <table> 
     <tr> 
      <td>Header</td> 
      <td>Type</td> 
      <td>Name</td> 
      <td>Date</td> 
      <td>Amount</td> 
     </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <%#Eval("Header")%> 
      </td> 
      <td> 
       <%#Eval("Type")%> 
      </td> 
      <td> 
       <%#Eval("Name")%> 
      </td> 
      <td> 
       <%#Eval("Date", "{0:d}")%> 
      </td> 
      <td> 
       <%#Eval("Value", "{0:c}")%> 
      </td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

en utilisant un GridView tout OU née DTO écrire dans la partie HTML est seulement:

<asp:GridView ID="gv" runat="server" DataSourceID="ods" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:BoundField DataField="Header" HeaderText="Header" /> 
     <asp:BoundField DataField="Type" HeaderText="Type" /> 
     <asp:BoundField DataField="Name" HeaderText="Name" /> 
     <asp:BoundField DataField="Date" DataFormatString="{0:d}" HeaderText="Date" /> 
     <asp:BoundField DataField="Value" DataFormatString="{0:c}" HeaderText="Value" /> 
    </Columns> 
</asp:GridView> 

quelque chose plus simple et plus facile à lire

vous aurez beaucoup plus de contrôle en utilisant un objet GridView plutôt qu'un répéteur, et vous n'aurez jamais ce genre de problèmes, car le rendu de gridView sera toujours livré avec les balises de table.

Hope it helps

Et BTW, j'ai testé votre cas et je n'eu aucun problème, même si je n'ÉCRITURE mentionner les balises comme Spencer.

pour voir mon code: File with HTML and Method-File with myObject

Questions connexes