dados de exportação gridview
-
05-07-2019 - |
Pergunta
O que é a melhor maneira para exportar um gridview em uma planilha do Excel? Isso parece fácil
exceto que meu GridView não tem um atributo de exportação. Qual é a maneira mais rápida de fazer isso?
Solução
Em uma exportação para excel Escrever este código em btnexporttoExcel evento 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();
Outras dicas
Provavelmente há algo lá fora para isso, mas se você quiser fazê-lo sozinho, você poderia apenas escrever algum código que anda a coleção GridView.Rows, e depois o interior coleção GridViewRow.Cells disso.
Deve ser muito fácil de construir um arquivo CSV a partir daí, e Excel poderia lê-lo sem problema.
Os arquivos CSV são apenas arquivos de texto com valores dentro de aspas, separados por vírgulas. Como esta:
"value", "value", "value"
"value", "value", "value"
Você pode simplesmente pop Notepad uma aberta e construção com a mão para experimentá-lo.
Já fiz isso várias vezes. Excel tem uma versão XML. Ele acaba com a extensão .xml, mas você pode apenas mudar a extensão do arquivo para .xls e o arquivo XML formatado será aberto no excel muito bem.
O maior obstáculo dessa abordagem é o formato Excel XML. Eu costumo criar um arquivo do Excel no Excel no formato aproximado que eu desejo. Eu, então, salvar o arquivo do Excel para o formato XML, e abri-lo em um editor de texto.
Eu costumo criar um arquivo de modelo desta página amostra Excel. Então, quando eu estou exportar as informações no Gridview, eu só tenho que criar o XML para a seção que contém as células que planejam povoar, eu só preceder, e anexar o texto já no arquivo de modelo.
Uma vez que você abrir o arquivo excel xml formatado, você vai descobrir o XML necessária de forma relativamente fácil. A parte mais difícil de entender é a forma como as células referenciar as opções de formatação, que estão no topo do arquivo XML.
Boa sorte, deixe-me saber se você precisar de mais esclarecimentos.
Editar: Você só precisará criar o arquivo excel modelo de uma vez, apenas para obter uma sensação para o xml necessária que você precisa para gerar. Depois de gerar o XML usar o seguinte código para enviá-lo para o usuário:
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);
}
Este biblioteca para .net tem funcionado muito bem para os nossos casos de uso.
Esta biblioteca permite gerar Excel pastas de trabalho usando XML, é construído de 100% em C # e não requer Excel instalado em tudo para gerar os arquivos. Ela expõe um modelo de objeto simples para gerar as pastas de trabalho XML.
Não há nenhuma integração incorporada com um controle GridView, mas escrever um adaptador genérico é bastante fácil e seria reutilizável em outros projetos.
Este método vai direto para o formato Excel sem a necessidade de XML ser instalado no servidor ou usando 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
Eu costumava CarlosAg.ExcelXmlWriter
ligação .
Eu loop através de todos GridViews
HeaderCells
e, em seguida, através de todas as linhas. A única coisa é que se você permitir paginação e você tem mais de uma página você tem que definir o PageSize para um valor alto (I ajustado para 10 milhões), então DataBind
o GridView
novamente e fazer o seu trabalho. Depois definir o valor antigo PageSize volta. Se alguém sabe uma solução melhor, você é bem-vindo.
EDIT:. O try / catch está lá porque, por algum motivo, não é possível verificar o tipo de controle e, em seguida, lançar a etiqueta ou LinkButton ==> control.GetType()
Aqui está o meu código.
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
Você deve ter excel instalado e referenciar bibliotecas do Escritório de interoperabilidade no seu projeto. Adicionar:
As importações Microsoft.Office.Core, Importações Microsoft.Office.Interop
A solução acima leva o gridview e puxa o html fora dele. Em seguida, escreve-o em excel. O html proveniente da rede vai incluir atributos de estilo, como preenchimento e cor. Ele também irá fazer títulos de colunas classificáveis ??olhar como links. Quando eu usei isso eu escrevi um analisador personalizado para retirar todos os estilos indesejados fora para me dar apenas os dados brutos. Vou deixar essa tarefa cabe a você uma vez que é específico para cada grade.
É muito importante que você incluir a substituição para VerifyRenderingInServerForm, mesmo que não há qualquer dentro do código do mesmo.