Frage

Was ist der beste Weg, um exportieren Sie eine gridview in eine Excel-Tabelle? Dies scheint einfach

außer, dass mein Gridview nicht eine export-Attribut.Was ist der Schnellste Weg, dies zu tun?

War es hilfreich?

Lösung

In einem Export diesen Code zu übertreffen Schreiben btnexporttoExcel Click-Ereignis.

    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();

Andere Tipps

Es ist wahrscheinlich etwas da draußen für diese, aber wenn Sie wollen, es selbst tun Sie könnten nur einige Code schreiben, der die GridView.Rows Sammlung geht, und dann die GridViewRow.Cells Sammlung im Inneren davon.

Es sollte ziemlich einfach sein, von dort eine CSV-Datei zu erstellen und Excel es kein Problem lesen konnte.

CSV-Dateien sind Text nur Dateien mit Werten innerhalb von Zitaten, die durch Kommas getrennt. Wie folgt aus:

"value", "value", "value"
"value", "value", "value"

Sie können nur Notepad aufspringen und eine von Hand bauen, um es auszuprobieren.

Ich habe dies mehrmals getan. Excel verfügt über eine XML-Version. Es endet mit der Erweiterung .xml, aber Sie können nur die Erweiterung der Datei zu .xls ändern und die XML-Datei in Excel öffnen, wird gut.

Die größte Hürde dieses Ansatzes ist das Excel-XML-Format. Ich in der Regel eine Excel-Datei in Excel im ungefähren Format erstellen, das ich wünsche. Ich habe dann die Excel-Datei in XML-Format speichern und öffnen Sie sie in einem Texteditor.

ich in der Regel eine Vorlagendatei aus dieser Excel Beispielseite erstellen. Dann, wenn ich die Informationen in der Gridview am Export, ich muß nur die XML für den Abschnitt erstellen, die die Zellen enthalten ich auf bevölkern planen, ich habe gerade prepend und fügen Sie den Text bereits in der Vorlagendatei.

Wenn Sie die xml öffnen formatiert Excel-Datei, werden Sie relativ leicht die benötigte XML herauszufinden. Der schwierigste Teil zu verstehen, ist die Art, wie die Zellen die Formatierungsoptionen verweisen, die an der Spitze der XML-Datei sind.

Viel Glück, lassen Sie mich wissen, wenn Sie mehr Klärungsbedarf.

Edit: Sie werden nur die Vorlage Excel-Datei einmal erstellen müssen, nur um ein Gefühl für die benötigte xml zu erhalten, die Sie generieren müssen. Sobald Sie die XML generiert haben den folgenden Code an den Benutzer senden:

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);
}

Diese Bibliothek für .net sehr gut für unsere Anwendungsfälle gearbeitet hat.

  

Diese Bibliothek ermöglicht es Ihnen, Excel-Arbeitsmappe mit Hilfe von XML zu generieren, ist es 100% in C # gebaut ist und nicht erfordert Excel überhaupt installiert, um die Dateien zu generieren. Es macht ein einfaches Objektmodell der XML-Arbeitsmappen zu erzeugen.

Es gibt keine eingebaute Integration mit einem Gridview-Steuerelement, aber eine generische Adapter zu schreiben ist einfach genug und würde in anderen Projekten wiederverwendet werden.

Diese Methode geht direkt in Excel-Format ohne XML benötigte auf dem Server installiert werden, oder unter Verwendung von 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

Ich verwendet CarlosAg.ExcelXmlWriter link.

Ich schlang durch alle GridViews HeaderCells und dann durch alle Zeilen.Die einzige Sache ist, dass, wenn Sie zulassen, dass paging-und haben Sie mehr als eine Seite, die Sie stellen müssen, um die PageSize auf einen hohen Wert (ich 10000000), dann DataBind die GridView wieder und Tue deine Arbeit.Danach setzen Sie die alte PageSize-Wert zurück.Wenn jemand eine bessere Methode kennt, du bist willkommen.

EDIT:Der try/catch-ist es denn aus irgendeinem Grund ist es nicht möglich zu überprüfen, geben Sie das Steuerelement und dann gegossen, um Label oder LinkButton ==> control.GetType().

Hier ist mein 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;
    }
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

Sie müssen über Excel installiert und verweisen Sie auf die Office-Interop-Bibliotheken in Ihrem Projekt. Hinzufügen:

Die Einfuhren Microsoft.Office.Core, Import Microsoft.Office.Interop

Die Lösung oben nimmt die gridview und zieht den html aus ihm heraus. Dann schreibt sie zu übertreffen. Die HTML vom Netz kommt, werden Stilattribute wie Polsterung und Farbe umfasst. Es wird auch sortierbare Spaltenüberschriften wie Links zu suchen. Als ich das verwendete schrieb ich einen benutzerdefinierten Parser alle unerwünschten Styling Streifen aus mir nur die Rohdaten zu geben. Ich werde Sie diese Aufgabe bis verlassen, da es zu jedem Gitter spezifisch ist.

Es ist sehr wichtig, dass Sie die Überschreibung zu VerifyRenderingInServerForm enthalten, obwohl es in der es keinen Code ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top