2008-09-29 6 views
5

Permitimos que los usuarios creen 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.Enviar resultados de consultas a Excel desde el sitio web de ASP.NET

¿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.

Respuesta

10

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 here

//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); 
+1

Tenga en cuenta que esto no crea un archivo de Excel normal como si abrió Excel y creó uno manualmente ... es un archivo html. –

0

lo recomiendo el uso de un filehandler (.ashx) El único problema es la creación del archivo de Excel desde el 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.

1

Si crea una página que es solo una tabla con los resultados y configura 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 desea forzar un ahorro, que haría algo como lo siguiente:

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

Una vez que tenga el conjunto de datos se puede convertir a un objeto [,] e insertarlo en una Documento 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; 
     } 
+0

Pero no hagas eso (automatizar Excel) en un servidor. http://support.microsoft.com/kb/257757 – Cheeso

+0

Esto se realizó en el lado del cliente. –

0

Utilizaría un controlador para la extensión de archivo .xls y un componente gratuito para convertir la 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

1

Obtuve una función utils que ya lo hace. Una vez que pones en una tabla de datos, se puede exportar con la respuesta utilizando

 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(); 
       } 
+0

+1. Sin embargo, ¿qué pasa con esto: devolver conjuntos de resultados múltiples, utilizar una plantilla de Excel existente, varias hojas de trabajo y colocar cada conjunto de resultados en la (s) celda (s) apropiada (s) en la hoja de trabajo apropiada? – mg1075

0

Utilice amablemente este código para resolver su código problema.Este convertirá hoja de Excel a texto format.Hope esto va a resolver 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); 
Cuestiones relacionadas