2010-07-19 16 views

Respuesta

8

Puede utilizar un proveedor de datos OLEDB y simplemente tratar Excel como otro origen de datos ADO.NET para recorrer sus filas de DataTable e insertarlas en la hoja de cálculo de Excel. Aquí hay un artículo de Microsoft KB que lo guiará a través de muchos de los detalles.

http://support.microsoft.com/kb/316934/en-us

Lo más importante a tener en cuenta es que se puede crear libros y hojas de cálculo del libro, y se puede hacer referencia a las láminas existentes añadiendo un '$' al final del nombre. Si omite el '$' al final del nombre de la hoja, el proveedor OLEDB supondrá que es una hoja nueva e intentará crearla.

El signo del dólar tras el nombre de la hoja es una indicación de que existe la tabla. Si está creando una nueva tabla, como se describe en la sección Crear nuevos libros y tablas de este artículo, no use el signo de dólar.

Puede crear y hoja de cálculo en 2003 (.xls) o 2,007 formato (xlsx), y eso es definida en la cadena de conexión - se especifica el archivo que se va a escribir en, y sólo tiene que especificar la extensión. Asegúrese de usar la versión correcta del proveedor OLEDB.

Si desea crear una versión de 2003 (.xls), se utiliza esta cadena de conexión:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES 

Si desea crear un (.xlsx), versión 2007, se utiliza esta cadena de conexión:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES 

Es posible que deba descargar el proveedor de ACE de Microsoft para crear archivos XLSX. Lo puedes encontrar here.

Normalmente uso el proveedor de XLS, por lo que no he trabajado tanto con el proveedor de XLSX.

Espero que esto ayude. Avísame si tienes otras preguntas.

+0

Hice las cosas exactas. Pero cuando estoy creando archivos XLSX, se está creando, pero cuando intento abrirlo, muestra que el archivo está dañado. que debería hacer. Seguí los mismos pasos en el enlace Above MS que ha proporcionado – smilu

+0

Tenga en cuenta que utilizará los primeros 5 a 8 valores en la columna para "adivinar" su tipo de datos. Entonces establecerá cualquier valor no conforme a NULL. Es decir. si tiene una columna con los siguientes valores para, digamos, el número de teléfono: 004412345677, 00443777373, [... varios números más aquí ...], +44 (22) 3883774747, [.... algunos más números de teléfono con más y corchetes ...], etc., todos estos números telefónicos no numéricos se colocarán probablemente como NULL en el archivo resultante.Una forma de corregir esta falla de diseño requiere ajustar el registro. Otra opción puede ser el uso de OpenXML SDK 2.5, descarga gratuita de Microsoft. – demp

1

encontrado esto en algún viejo código que hice hace como 5 años que debería funcionar ...

public static void DataTableToExcel(DataTable tbl) 
{ 
    HttpContext context = HttpContext.Current; 
    context.Response.Clear(); 
    foreach (DataColumn c in tbl.Columns) 
    { 
     context.Response.Write(c.ColumnName + ";"); 
    } 
    context.Response.Write(Environment.NewLine); 
    foreach (DataRow r in tbl.Rows) 
    { 
     for (int i = 0; i < tbl.Columns.Count; i++) 
     { 
      context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";"); 
     } 
     context.Response.Write(Environment.NewLine); 
    } 
    context.Response.ContentType = "text/csv"; 
    context.Response.AppendHeader("Content-Disposition", 
     "attachment; filename=export.csv"); 
    context.Response.End(); 
} 

Esta es la salida de una respuesta ASP.NET con un archivo CSV que puede abrir Excel 2007. Si lo desea, puede cambiar la extensión de imitar Excel y debería funcionar simplemente mediante la sustitución de las siguientes líneas:

context.Response.ContentType = "application/vnd.ms-excel"; 
    context.Response.AppendHeader("Content-Disposition", 
     "attachment; filename=export.xlsx"); 

Un CSV es la manera más fácil si usted no necesita hacer nada complejo. Si realmente necesita que sea un archivo de Excel 2007 en el formato nativo, deberá usar una biblioteca de Office para compilarlo o convertirlo de CSV y luego servirlo/guardarlo.

Este enlace también puede ser útil:

How to avoid the Excel prompt window when exporting data to Excel 2007

+0

@hey, soy tryn a hacer lo mismo ... pero sin éxito .... ¿Puedes responder a la publicación de ma ... gracias Mi pregunta (http://stackoverflow.com/questions/13737495/format-error-while-exporting-to-excel-from-gridview-in-asp- net) – Kulkarni

0

Vas a tener que hacer un montón de interoperabilidad, aquí es un tutorial, espero que ayude. link text

3

Escribí el siguiente código para la compañía hace algún tiempo. Toma Enumerable de cualquier tipo de clase y exporta todas sus propiedades (get) a Excel y también abre Excel. Debería poder hacer algo similar para una DataTable. Recuerde que usted necesita para agregar referencia a Microsoft.Office.Interop.Excel

public static void ExportToExcel<T>(IEnumerable<T> exportData) 
    { 
     Excel.ApplicationClass excel = new Excel.ApplicationClass(); 
     Excel.Workbook workbook = excel.Application.Workbooks.Add(true); 
     PropertyInfo[] pInfos = typeof(T).GetProperties(); 
     if (pInfos != null && pInfos.Count() > 0) 
     { 
      int iCol = 0; 
      int iRow = 0; 
      foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true)) 
      { 
       // Add column headings... 
       iCol++; 
       excel.Cells[1, iCol] = eachPInfo.Name; 
      } 
      foreach (T item in exportData) 
      { 
       iRow++; 
       // add each row's cell data... 
       iCol = 0; 
       foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true)) 
       { 
        iCol++; 
        excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null); 
       } 

      } 
      // Global missing reference for objects we are not defining... 
      object missing = System.Reflection.Missing.Value; 
      // If wanting to Save the workbook... 
      string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm"; 
      workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); 
      // If wanting to make Excel visible and activate the worksheet... 
      excel.Visible = true; 
      Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet; 
      excel.Rows.EntireRow.AutoFit(); 
      excel.Columns.EntireColumn.AutoFit(); 
      ((Excel._Worksheet)worksheet).Activate(); 
     } 
    } 
2

Tengo una DataTable que necesito para poner en formato Excel 2007 y guardarlo como un archivo de Excel (.xlsx) 2007.

¿Alguien me puede ayudar a lograr esto?

Solo necesita agregar mi clase C gratuita a su proyecto, y una línea de código.

Los detalles completos (con código de descarga gratuita de origen, y un proyecto de ejemplo) aquí:

Mikes Knowledge Base - Export to Excel

Mi biblioteca utiliza los Microsoft OpenXML bibliotecas libres (también provistos en mis descargas) para escribir el archivo , por lo que no tiene que usar las bibliotecas VSTO de peso pesado ni tener instalado Excel en su servidor.

Además, crea un archivo real .xlsx, en lugar de algunos otros métodos que escriben una secuencia de datos en un archivo de texto separado por comas, pero nómbrelo como un archivo .xls.

Por cierto, tuve cargas de las dificultades al grabar en archivos de Excel usando OLEDB, sobre todo porque yo estaba corriendo Windows 7 de 64 bits, con Office 2007 (que es de 32 bits) y el proveedor de Microsoft ACE tiene que ser la edición de 64 bits ... pero no puede instalar esto, si tiene instalada la versión de 32 bits de Office.

Por lo tanto, debe desinstalar Office, instalar el controlador ACE y luego volver a instalar Office.
Pero incluso así, dejé de usar OLEDB ... simplemente no era lo suficientemente estable.

0

Vio que alguien más publicó una opción "guardar en csv". Mientras eso no parecía ser la respuesta de la OP estaba buscando, aquí está mi versión que incluye las cabeceras de la tabla

public static String ToCsv(DataTable dt, bool addHeaders) 
    { 
     var sb = new StringBuilder(); 
     //Add Header Header 
     if (addHeaders) 
     { 
      for (var x = 0; x < dt.Columns.Count; x++) 
      { 
       if (x != 0) sb.Append(","); 
       sb.Append(dt.Columns[x].ColumnName); 
      } 
      sb.AppendLine(); 
     } 
     //Add Rows 
     foreach (DataRow row in dt.Rows) 
     { 
      for (var x = 0; x < dt.Columns.Count; x++) 
      { 
       if (x != 0) sb.Append(","); 
       sb.Append(row[dt.Columns[x]]); 
      } 
      sb.AppendLine(); 
     } 
     return sb.ToString(); 
    } 
Cuestiones relacionadas