net mvc exportar create asp asp.net excel

mvc - Enviar resultados de consulta a Excel desde el sitio web ASP.NET



exportar a excel asp net (7)

Cambia el tipo de archivo de la página a excel y solo transmite el HTML necesario para crear una tabla en la página. código de aquí

//for demo purpose, lets create a small datatable & populate it with dummy data System.Data.DataTable workTable = new System.Data.DataTable(); //The tablename specified here will be set as the worksheet name of the generated Excel file. workTable.TableName = "Customers"; workTable.Columns.Add("Id"); workTable.Columns.Add("Name"); System.Data.DataRow workRow; for (int i = 0; i <= 9; i++) { workRow = workTable.NewRow(); workRow[0] = i; workRow[1] = "CustName" + i.ToString(); workTable.Rows.Add(workRow); } //...and lets put DataTable2ExcelString to work string strBody = DataTable2ExcelString(workTable); Response.AppendHeader("Content-Type", "application/vnd.ms-excel"); Response.AppendHeader("Content-disposition", "attachment; filename=my.xls"); Response.Write(strBody);

Permitimos a los usuarios crear consultas ad-hoc en nuestro sitio web. Nos gustaría que el usuario seleccione sus criterios, luego haga clic en enviar y los resultados se transmitirán automáticamente a Excel. Tengo la aplicación poblando una DataTable, luego usando datatable para crear una cadena delimitada por tabulaciones. El problema es lograr eso para sobresalir.

¿Cuál es la mejor forma de transmitir datos a Excel? Preferiblemente, no tendríamos que hacer que los usuarios cierren una ventana vacía después de hacer clic en el botón Enviar.


Recomiendo usar un manejador de archivos (.ashx) El único problema es crear el archivo de Excel desde DataTable. Hay muchos productos de terceros que harán esto por usted (por ejemplo, Infragistics proporciona un componente que hace justamente esto).

Una cosa que recomiendo en contra es usar la interoperabilidad de Excel en su servidor ... es muy pesado y no es compatible.


Si crea una página que sea solo una tabla con los resultados y establece el tipo de contenido de la página en "application / vnd.ms-excel", el resultado será en Excel.

Response.ContentType = "application/vnd.ms-excel";

Si quieres forzar un guardado, harías algo como lo siguiente:

Response.AddHeader("Content-Disposition", "attachment; filename=somefilename.xls");


Tengo una función utils que hace esto ya. Una vez que lo coloca en una tabla de datos, puede exportarlo con la Respuesta usando

public static void DataTabletoXLS(DataTable DT, string fileName) { HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Charset = "utf-16"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250"); HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; string tab = ""; foreach (DataColumn dc in DT.Columns) { HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("/n", "").Replace("/t", "")); tab = "/t"; } HttpContext.Current.Response.Write("/n"); int i; foreach (DataRow dr in DT.Rows) { tab = ""; for (i = 0; i < DT.Columns.Count; i++) { HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("/n", "").Replace("/t", "")); tab = "/t"; } HttpContext.Current.Response.Write("/n"); } HttpContext.Current.Response.End(); }


Una vez que tenga su Dataset, puede convertirlo en un objeto [,] e insertarlo en un documento de Excel. Luego puede guardar el documento en el disco y transmitirlo al usuario.

//write the column headers for (int cIndex = 1; cIndex < 1 + columns; cIndex++) sheet.Cells.set_Item(4, cIndex, data.Columns[cIndex - 1].Caption); if (rows > 0) { //select the range where the data will be pasted Range r = sheet.get_Range(sheet.Cells[5, 1], sheet.Cells[5 + (rows - 1), columns]); //Convert the datatable to an object array object[,] workingValues = new object[rows, columns]; for (int rIndex = 0; rIndex < rows; rIndex++) for (int cIndex = 0; cIndex < columns; cIndex++) workingValues[rIndex, cIndex] = data.Rows[rIndex][cIndex].ToString(); r.Value2 = workingValues; }


Utilizaría un controlador para la extensión de archivo .xls y un componente gratuito para convertir DataTable al formato nativo xls. El componente de este sitio http://www.csvreader.com/ hace más de lo que implica la URL. La versión más nueva de Excel se quejará de un archivo XLS con formato HTML. También tenga en cuenta el tamaño de los datos que se devuelven. Su servidor web debería usar compresión para esta extensión y su código debería verificar si el número de filas devuelto es mayor que lo que Excel puede mostrar en una hoja de cálculo; Se pueden requerir varias hojas. http://www.mrexcel.com/archive2/23600/26869.htm


Utilice amablemente este código para resolver su problema. Este código convertirá la hoja de Excel a formato de texto. Espero que esto solucione su problema.

grdSrcRequestExport.RenderControl(oHtmlTextWriter); string s = ""; s=oStringWriter.ToString().Replace("<table cellspacing=/"0/" rules=/"all/" border=/"1/" style=/"border-collapse:collapse;/">", ""); s="<html xmlns:o=/"urn:schemas-microsoft-com:office:office/" xmlns:x=/"urn:schemas-microsoft-com:office:excel/" xmlns=/"http://www.w3.org/TR/REC-html40/"><head><meta http-equiv=Content-Type content=/"text/html; charset=us-ascii/"><meta name=ProgId content=Excel.Sheet><meta name=Generator content=/"Microsoft Excel 11/"><table x:str border=0 cellpadding=0 cellspacing=0 width=560 style=''border-collapse: collapse;table-layout:fixed;width:420pt''>"+s.ToString()+"</table></body></html>"; //Byte[] bContent = System.Text.Encoding.GetEncoding("utf-8").GetBytes(); Response.Write(s);