esportare dati gridview
-
05-07-2019 - |
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?
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.