Quelle est la meilleure façon d'exporter un gridview dans une feuille de calcul Excel? This seems easyexporter des données gridview
sauf que ma grille n'a pas d'attribut d'exportation. Quel est le moyen le plus rapide de le faire?
Quelle est la meilleure façon d'exporter un gridview dans une feuille de calcul Excel? This seems easyexporter des données gridview
sauf que ma grille n'a pas d'attribut d'exportation. Quel est le moyen le plus rapide de le faire?
Dans une exportation vers Excel Écrivez ce code sur l'événement btnexporttoExcel Click.
string attachment = "attachment; filename=Export.xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
// Create a form to contain the grid
HtmlForm frm = new HtmlForm();
gv.Parent.Controls.Add(frm);
frm.Attributes["runat"] = "server";
frm.Controls.Add(gv);
frm.RenderControl(htw);
//GridView1.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
This library pour .net a très bien fonctionné pour nos cas d'utilisation.
Cette bibliothèque vous permet de générer des classeurs Excel à l'aide de XML, elle est construite à 100% en C# et ne nécessite aucun fichier Excel pour générer les fichiers. Il expose un modèle objet simple pour générer les classeurs XML.
Il n'y a pas d'intégration intégrée avec un contrôle GridView, mais l'écriture d'un adaptateur générique est assez facile et serait réutilisable dans d'autres projets.
Il y a probablement quelque chose pour cela, mais si vous voulez le faire vous-même, vous pouvez simplement écrire du code qui parcourt la collection GridView.Rows, puis la collection GridViewRow.Cells à l'intérieur de cela.
Il devrait être assez facile de créer un fichier CSV à partir de là, et Excel pourrait le lire sans problème. Les fichiers CSV sont simplement des fichiers texte avec des valeurs entre guillemets, séparés par des virgules. Comme ceci:
"value", "value", "value"
"value", "value", "value"
Vous pouvez simplement ouvrir le Bloc-notes et en créer un à la main pour l'essayer.
Private exportToExcel As Boolean = False
Private Sub LoadInExcel()
Me.Response.ClearContent()
Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls")
Me.Response.ContentType = "application/ms-excel"
Dim sw1 As New IO.StringWriter
Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1)
GridView1.RenderControl(htw1)
Response.Write(sw1.ToString())
Response.End()
End Sub
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
' Confirms that an HtmlForm control is rendered for the specified ASP.NET
' server control at run time.
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
If exportToExcel Then
LoadInExcel()
End If
MyBase.Render(writer)
End Sub
Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
exportToExcel = True
End Sub
Vous devez installer Excel et référencer les bibliothèques Office Interop dans votre projet. Ajouter:
Importations Microsoft.Office.Core, Imports Microsoft.Office.Interop
La solution prend au-dessus du gridview et tire le code html hors de lui. Puis l'écrit pour exceller. Le html provenant de la grille inclura des attributs de style tels que le remplissage & couleur. Cela rendra également les en-têtes de colonnes triables ressemblant à des liens. Quand j'ai utilisé ceci, j'ai écrit un analyseur personnalisé pour enlever tous les styles indésirables pour ne me donner que les données brutes. Je vais vous laisser cette tâche car elle est spécifique à chaque grille.
Il est très important d'inclure le remplacement à VerifyRenderingInServerForm, même s'il n'y a pas de code à l'intérieur.
j'aime où vous allez avec ceci. Cependant, je ne suis pas autorisé à importer microsoft.office.core – Eric
où puis-je obtenir les fichiers Microsoft Office? – Eric
@Eric - Vous pouvez les obtenir en installant Office sur la même machine. Cependant, il convient de noter que l'exécution de Office sur un serveur n'est généralement pas considérée comme une meilleure pratique. – rjzii
Je l'ai fait plusieurs fois. Excel a une version XML. Il se termine par l'extension .xml, mais vous pouvez simplement changer l'extension du fichier en .xls et le fichier au format XML s'ouvrira très bien dans Excel.
Le plus gros obstacle de cette approche est le format XML Excel. Je crée généralement un fichier Excel dans Excel dans le format approximatif que je désire. Je sauvegarde ensuite le fichier Excel au format XML et l'ouvre dans un éditeur de texte.
Je crée généralement un fichier de modèle à partir de cette page exemple Excel. Ensuite, lorsque j'exporte l'information dans Gridview, je dois seulement créer le xml pour la section qui contient les cellules que j'ai l'intention de remplir, je viens juste de rajouter, et ajouter le texte déjà dans le fichier modèle.Une fois que vous ouvrez le fichier Excel au format xml, vous calculerez le code XML nécessaire relativement facilement. La partie la plus difficile à comprendre est la façon dont les cellules référencent les options de formatage, qui sont en haut du fichier XML.
Bonne chance, faites-moi savoir si vous avez besoin de plus de précisions.
Edit: Vous aurez seulement besoin de créer le modèle Excel fichier une fois, juste pour avoir une idée de l'xml nécessaire que vous aurez besoin de générer. Une fois que vous avez généré le xml utilisez le code suivant pour l'envoyer à l'utilisateur:
string fileName = "ExportedFile.xls";
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID);
Response.End();
public static void ExportToExcel(Stream outputStream)
{
XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default);
//ExcelHeaderString and ExcelStylesString are from the template
xmlSink.WriteRaw(ExcelHeaderString);
xmlSink.WriteRaw(ExcelStylesString);
//write your elements here
xmlSink.WriteElement("YourElements");
//ExcelFooterString is from the template
xmlSink.WriteRaw(ExcelFooterString);
}
mon problème avec ceci est que je devrais le faire à chaque machine non? Je devrais créer un fichier Excel sur chaque machine. Ceci est l'application sera utilisée à l'échelle de l'entreprise. – Eric
Je pensais que vous programmeriez ceci dans le code qui contient le GridView. Je suis un peu confus par votre déclaration. Créez-vous une application Web ou une application de bureau? – Chris
oui. c'est correct. Je vais essayer de programmer cela. Ceci est une application Web. Je peux être celui qui est confus. mais vous avez dit que vous devez normalement créer un fichier Excel dans Excel. Je devrais faire cela sur chaque ordinateur que cette application est utilisée correctement? – Eric
J'utilisé CarlosAg.ExcelXmlWriter
link.
Je bouclé à travers tous GridViews
HeaderCells
, puis à travers toutes les lignes. La seule chose est que si vous autorisez la pagination et que vous avez plus d'une page, vous devez définir le PageSize à une valeur élevée (je définis à 10000000) puis DataBind
le GridView
à nouveau et faites votre travail. Ensuite, définissez l'ancienne valeur PageSize. Si quelqu'un connaît une meilleure solution, vous êtes le bienvenu.
EDIT: L'essai/catch est là parce que, pour une raison quelconque, il n'est pas possible de vérifier le type de contrôle, puis de le lancer vers Label ou LinkButton ==> control.GetType()
.
Voici mon code.
public static Workbook CreateWorkbook(GridView gridView)
{
int pageSize = gridView.PageSize;
gridView.PageSize = 10000000;
gridView.DataBind();
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets.Add("Export");
WorksheetStyle style = workbook.Styles.Add("headerStyle");
style.Font.Bold = true;
style = workbook.Styles.Add("defaultStyle");
style.Alignment.WrapText = true;
style = workbook.Styles.Add("infoStyle");
style.Font.Color = "Red";
style.Font.Bold = true;
sheet.Table.Rows.Add(new WorksheetRow());
WorksheetRow headerRow = new WorksheetRow();
foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells)
{
if (!string.IsNullOrEmpty(cell.Text))
headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle");
else
foreach (Control control in cell.Controls)
{
LinkButton linkButton = new LinkButton();
try
{
linkButton = (LinkButton)control;
}
catch { }
if (!string.IsNullOrEmpty(linkButton.Text))
headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle");
else
{
Label label = new Label();
try
{
label = (Label)control;
}
catch { }
if (!string.IsNullOrEmpty(label.Text))
headerRow.Cells.Add(label.Text, DataType.String, "headerStyle");
}
}
}
sheet.Table.Rows.Add(headerRow);
foreach (GridViewRow row in gridView.Rows)
{
WorksheetRow wrow = new WorksheetRow();
foreach (TableCell cell in row.Cells)
{
foreach (Control control in cell.Controls)
{
if (control.GetType() == typeof(Label))
{
wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle");
}
}
}
sheet.Table.Rows.Add(wrow);
}
gridView.PageSize = pageSize;
return workbook;
}
Cette méthode passe directement au format Excel sans nécessiter l'installation de XML sur le serveur ou en utilisant XML.
Protected Sub ExportToExcel()
Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1")
If Not gv1 Is Nothing Then
Response.ClearHeaders()
Response.ClearContent()
' Set the content type to Excel
Response.ContentType = "application/vnd.ms-excel"
' make it open the save as dialog
Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls")
'Turn off the view state
Me.EnableViewState = False
'Remove the charset from the Content-Type header
Response.Charset = String.Empty
Dim myTextWriter As New System.IO.StringWriter
Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter)
Dim frm As HtmlForm = New HtmlForm()
Controls.Add(frm)
frm.Controls.Add(gv1)
'Get the HTML for the control
frm.RenderControl(myHtmlTextWriter)
'Write the HTML to the browser
Response.Write(myTextWriter.ToString())
'End the response
Response.End()
End If
End Sub
Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
If root.ID = id Then
Return root
End If
Dim c As Control
For Each c In root.Controls
Dim t As Control = FindControlRecursive(c, id)
If Not t Is Nothing Then
Return t
End If
Next
Return Nothing
End Function
Cela devrait probablement être sur le super-utilisateur –
Je ne suis pas d'accord, s'il veut le faire par programme. Ce que je pense est le cas. –
oui brian. Je veux cela par programme. – Eric