J'ai une table html (pas Gridview) et qui n'a pas d'en-tête et de lignes appropriés. Au lieu de cela, il a une structure et des données personnalisées. Je souhaite exporter ce tableau vers Excel. Comment puis-je faire en utilisant ASP.NET?
Les étiquettes sont du texte fixe et les valeurs entières proviennent de la base de données. Ainsi, la structure de la table est fixe, seules les valeurs entières/décimales changent.
Vous souhaitez exporter la structure et les données personnalisées du tableau HTML (pas Gridview) vers Excel à l'aide d'ASP.NET.
Essayez l'approche suivante
Fournissez le ID
et ajoutez runat="server"
attribut
<table id="tbl" runat="server" >
Ajoutez le code suivant
Response.ContentType = "application/x-msexcel";
Response.AddHeader("Content-Disposition", "attachment;
filename=ExcelFile.xls");
Response.ContentEncoding = Encoding.UTF8;
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
tbl.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
Vous pouvez utiliser le code ci-dessous:
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=Print.xls");
Response.Write("<html xmlns:x=\"urn:schemas-Microsoft-com:office:Excel\">");
Response.Write("<head>");
Response.Write("<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf- 8\">");
Response.Write("<!--[if gte mso 9]><xml>");
Response.Write("<x:ExcelWorkbook>");
Response.Write("<x:ExcelWorksheets>");
Response.Write("<x:ExcelWorksheet>");
Response.Write("<x:Name>Report Data</x:Name>");
Response.Write("<x:WorksheetOptions>");
Response.Write("<x:Print>");
Response.Write("<x:ValidPrinterInfo/>");
Response.Write("</x:Print>");
Response.Write("</x:WorksheetOptions>");
Response.Write("</x:ExcelWorksheet>");
Response.Write("</x:ExcelWorksheets>");
Response.Write("</x:ExcelWorkbook>");
Response.Write("</xml>");
Response.Write("<![endif]--> ");
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
tbl.RenderControl(hw);
Response.Write(tw.ToString());
Response.Write("</head>");
Response.flush();
Il est également conseillé de donner des CSS en ligne si vous voulez que la sortie exportée soit exactement la même que votre interface utilisateur. Si vous appliquez des classes CSS à la table, elle ne s'affichera pas dans Excel exporté.
Si dtReport contient la table (c'est-à-dire les données à exporter), nous pouvons exporter la table vers Excel en utilisant le LOC suivant et nous pouvons également formater l'en-tête
if (dtReports != null && dtReports.Rows.Count > 0 && !string.IsNullOrEmpty(formName))
{
string filename = formName.ToUpper() + ParsConstant.XLS_EXTENSION;
StringWriter tw = new StringWriter();
using (HtmlTextWriter hw = new HtmlTextWriter(tw))
{
//Binding Datatable to DataGrid.
DataGrid dgGrid = new DataGrid();
dgGrid.DataSource = dtReports;
dgGrid.DataBind();
//Some Properties for the Header
dgGrid.HeaderStyle.Font.Bold = true;
dgGrid.HeaderStyle.Font.Size = 13;
//Get the HTML for the control.
dgGrid.RenderControl(hw);
Response.ContentType = "application/vnd.ms-Excel";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
//Response.Write("<style> TD { mso-number-format:\\@; } </style>");
Response.Write(tw.ToString());
Response.End();
}
}
l'utilisation du format MSO n'évitera pas les zéros non significatifs, mais il convertira le texte en chaîne, ce qui n'est pas recommandé pour effectuer des opérations.
Il n'y a aucun moyen automatisé. Mais vous pouvez utiliser le même code pour créer la table et l'écrire à la place. Si vous l'écrivez comme un simple fichier CSV, l'utilisateur peut le charger dans Excel en cliquant simplement sur le fichier téléchargé.
En définissant les en-têtes appropriés, vous pouvez demander au navigateur de traiter le contenu comme un téléchargement au lieu d'une page Web. J'ai posté le code pour le faire dans cet article .
Si vos données sont basées sur des données (sinon vous pourriez les stocker dans un fichier XML), alors regardez une question similaire que j'ai postée récemment.