Domanda

Qual è il modo migliore per esportare una visualizzazione griglia in un foglio di calcolo Excel? Sembra facile

tranne per il fatto che il mio Gridview non ha un attributo di esportazione. Qual è il modo più rapido per farlo?

È stato utile?

Soluzione

In un'esportazione verso Excel Scrivi questo codice sull'evento Click btnexporttoExcel.

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

Altri suggerimenti

Probabilmente c'è qualcosa là fuori per questo, ma se vuoi farlo da solo potresti scrivere del codice che accompagna la raccolta GridView.Rows e quindi la raccolta GridViewRow.Cells all'interno di quello.

Dovrebbe essere abbastanza facile costruire un file CSV da lì, e Excel potrebbe leggerlo senza problemi.

I file CSV sono solo file di testo con valori tra virgolette, separati da virgole. In questo modo:

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

Puoi semplicemente aprire Blocco note e crearne uno a mano per provarlo.

L'ho fatto più volte. Excel ha una versione XML. Finisce con l'estensione .xml, ma puoi semplicemente cambiare l'estensione del file in .xls e il file in formato XML si aprirà in Excel bene.

Il più grande ostacolo di questo approccio è il formato XML Excel. Di solito creo un file Excel in Excel nel formato approssimativo che desidero. Quindi salvo il file Excel in formato XML e lo apro in un editor di testo.

Di solito creo un file modello da questa pagina di esempio di Excel. Quindi, quando esporto le informazioni in Gridview, devo solo creare l'xml per la sezione che contiene le celle su cui prevedo di popolare, semplicemente anteporre e aggiungere il testo già nel file modello.

Dopo aver aperto il file Excel in formato XML, scoprirai l'XML necessario in modo relativamente semplice. La parte più difficile da capire è il modo in cui le celle fanno riferimento alle opzioni di formattazione, che si trovano nella parte superiore del file XML.

Buona fortuna, fammi sapere se hai bisogno di ulteriori chiarimenti.

Modifica Dovrai creare il file Excel modello solo una volta, solo per avere un'idea dell'xml necessario che dovrai generare. Dopo aver generato l'xml, utilizzare il seguente codice per inviarlo all'utente:

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

Questa libreria per .net ha funzionato molto bene per i nostri casi d'uso.

  

Questa libreria consente di generare cartelle di lavoro di Excel tramite XML, è costruita al 100% in C # e non richiede affatto che Excel sia installato per generare i file. Espone un semplice modello a oggetti per generare le cartelle di lavoro XML.

Non c'è integrazione integrata con un controllo GridView, ma scrivere un adattatore generico è abbastanza facile e sarebbe riutilizzabile in altri progetti.

Questo metodo va direttamente in formato Excel senza richiedere l'installazione di XML sul server o tramite 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

Ho usato CarlosAg.ExcelXmlWriter link .

Ho passato in rassegna tutte le GridViews HeaderCells e poi tutte le righe. L'unica cosa è che se permetti il ??paging e hai più di una pagina devi impostare PageSize su un valore alto (ho impostato su 10000000) quindi DataBind il GridView di nuovo e fai il tuo lavoro. Successivamente ripristina il vecchio valore di PageSize. Se qualcuno conosce una soluzione migliore, sei il benvenuto.

EDIT: il try / catch è lì perché per qualche motivo non è possibile controllare il tipo di controllo e quindi trasmettere a Label o LinkButton == > control.GetType () .

Ecco il mio codice.

 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

Devi avere Excel installato e fare riferimento alle librerie di interoperabilità di Office nel tuo progetto. Aggiungere:

Importa Microsoft.Office.Core, Importa Microsoft.Office.Interop

La soluzione sopra prende il gridview e ne estrae l'html. Quindi lo scrive per eccellere. L'html proveniente dalla griglia includerà attributi di stile come padding & amp; colore. Inoltre farà apparire le intestazioni delle colonne ordinabili come collegamenti. Quando l'ho usato ho scritto un parser personalizzato per eliminare tutti gli stili indesiderati per darmi solo i dati non elaborati. Lascio a te questo compito poiché è specifico per ciascuna griglia.

È molto importante includere l'override in VerifyRenderingInServerForm, anche se al suo interno non è presente alcun codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top