2009-09-24 7 views
0

Voici la disposition, j'ai un contrôle FormView avec des données dynamiques provenant d'un serveur SQL. J'utilise le mode ReadOnly de FormView. Comment puis-je modifier la méthode PrepareFormViewForExport pour supprimer les zones de texte et laisser les valeurs dans FormView derrière? À l'heure actuelle, la sortie affiche des étiquettes mais ignore les valeurs des zones de texte.FormView to Excel - Comment extraire les données des contrôles dans un modèle pour les placer dans des cellules

Il s'agit du code C# lorsque vous cliquez sur le bouton d'exportation.

protected void Bexport_Click(object sender, EventArgs e) 
{ 
    //Clear the Response object 
    Response.Clear(); 
    //set Response header to the Excel filename required (.xls for excel, .doc for word) 
    Response.AddHeader("content-disposition", "attachment;filename=ReportOuput.xls"); 
    Response.Charset = ""; 
    // If you want the option to open the Excel 
    // file without the save option then un-comment out the line below 
    //Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    //FOR EXCEL 
    Response.ContentType = "application/vnd.xls"; 
    //FOR WORD 
    //Response.ContentType = "application/vnd.doc"; 
    //Declare new stringwriter and html writer 
    StringWriter stringWrite = new System.IO.StringWriter(); 
    HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
    //Strip out controls from FormView ?takes data too? 
    PrepareFormViewForExport(FormView2); 
    //render controls data as HTML 
    FormView2.RenderControl(htmlWrite);  
    //Clean out the Javascript postbacks etc. 
    string html = stringWrite.ToString(); 
    html = Regex.Replace(html, "</?(a|A).*?>", ""); 
    StringReader reader = new StringReader(html); 
    //Write xls document 
    Response.Write(html); 
    //end current Response 
    HttpContext.Current.Response.End(); 

} 

Voici la méthode permettant de supprimer des contrôles de FormView avant de les exporter.

private void PrepareFormViewForExport(Control fv) 
{ 
    LinkButton lb = new LinkButton(); 
    Literal l = new Literal(); 
    string name = String.Empty; 
    TextBox TB = new TextBox(); 

    for (int i = 0; i < fv.Controls.Count; i++) 
    { 
     if (fv.Controls[i].GetType() == typeof(LinkButton)) 
     { 
      l.Text = (fv.Controls[i] as LinkButton).Text; 
      fv.Controls.Remove(fv.Controls[i]); 
      fv.Controls.AddAt(i, l); 
     } 
     else if (fv.Controls[i].GetType() == typeof(TextBox)) 
     { 
      l.Text = (fv.Controls[i] as TextBox).Text; 
      fv.Controls.Remove(fv.Controls[i]); 
      fv.Controls.AddAt(i, l); 
     } 
     else if (fv.Controls[i].GetType() == typeof(DropDownList)) 
     { 
      l.Text = (fv.Controls[i] as DropDownList).SelectedItem.Text; 
      fv.Controls.Remove(fv.Controls[i]); 
      fv.Controls.AddAt(i, l); 
     } 
     else if (fv.Controls[i].GetType() == typeof(CheckBox)) 
     { 
      l.Text = (fv.Controls[i] as CheckBox).Checked ? "True" : "False"; 
      fv.Controls.Remove(fv.Controls[i]); 
      fv.Controls.AddAt(i, l); 
     } 
     if (fv.Controls[i].HasControls()) 
     { 
      PrepareFormViewForExport(fv.Controls[i]); 
     } 
    } 
} 

Répondre

1

essayer diffusion Fiche Gear composant tiers http://www.spreadsheetgear.com/

+0

qui a l'air génial, mais pour 999 $ est hors de mon budget de 0 $. Merci d'avoir répondu! –

1

Eh bien, je trouve une solution, pas un vrai sollution. Puisque mon formulaire est en ReadOnly, j'ai changé les contrôles des zones de texte en étiquettes. Cela permet au writer html de vider les données dans Excel au lieu d'essayer de copier des zones de texte. Je serais toujours intéressé de savoir si quelqu'un sait comment répondre à la question initiale cependant.

Questions connexes