2010-02-04 61 views
8

Tengo los datos procedentes de la tabla del modelo de Entity Data en mi página ASP.NET. Ahora tengo que exportar esta información a Excel al hacer clic en el botón.Cómo exportar datos a Excel usando LINQ to Entity?

Si se está utilizando OLEDB, es sencillo, ya que es aquí: http://csharp.net-informations.com/excel/csharp-excel-oledb-insert.htm

Aquí es mi función para leer los datos de la tabla de consultas:

var model = from i in myEntity.Inquiries 
      where i.User_Id == 5 
         orderby i.TX_Id descending 
         select new { 
          RequestID = i.TX_Id, 
          CustomerName = i.CustomerMaster.FirstName, 
          RequestDate = i.RequestDate, 
          Email = i.CustomerMaster.MS_Id, 
          DocDescription = i.Document.Description, 
          ProductName = i.Product.Name 
+0

http://www.hanselman.com/blog/BackToBasicsKeepItSimpleAndDevelopYourSenseOfSmellFromLinqToCSV.aspx –

Respuesta

1

simplemente puede escribir una representación de cadena de sus datos - pestaña delimitada para cada campo y \ r \ n delimitada para cada fila. Luego transmítelo al navegador como un archivo .csv, que se abrirá automáticamente en Excel.

+0

Encontré la solución. Aqui tienes. http://stackoverflow.com/questions/1932568/exporting-a-html-table-to-excel – Rita

+0

También puede ver aquí: http://stackoverflow.com/questions/151005/create-excel-xls -y-xlsx-file-from-c / –

0

Puede considerar usar SpreadSheetML, que básicamente es un archivo XML con un proceso Cocoon mencionado en la parte superior del archivo xml para iniciar la aplicación Excel al hacer doble clic en el archivo xml. Muestra para SpreadSheetML proporcionada a continuación.

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:ms="urn:schemas-microsoft-com:xslt"> 
    <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
     <Author xmlns="urn:schemas-microsoft-com:office:spreadsheet">Author<"/Author> 
     <LastAuthor xmlns="urn:schemas-microsoft-com:office:spreadsheet">Author<"/LastAuthor> 
     <Created xmlns="urn:schemas-microsoft-com:office:spreadsheet"/> 
     <LastSaved xmlns="urn:schemas-microsoft-com:office:spreadsheet"/> 
     <Company xmlns="urn:schemas-microsoft-com:office:spreadsheet">Author<"/Company> 
     <Version xmlns="urn:schemas-microsoft-com:office:spreadsheet">11.8132<"/Version> 
    </DocumentProperties> 
    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
     <WindowHeight xmlns="urn:schemas-microsoft-com:office:spreadsheet">12660<"/WindowHeight> 
     <WindowWidth xmlns="urn:schemas-microsoft-com:office:spreadsheet">19020<"/WindowWidth> 
     <WindowTopX xmlns="urn:schemas-microsoft-com:office:spreadsheet">120<"/WindowTopX> 
     <WindowTopY xmlns="urn:schemas-microsoft-com:office:spreadsheet">105<"/WindowTopY> 
     <ProtectStructure xmlns="urn:schemas-microsoft-com:office:spreadsheet">False<"/ProtectStructure> 
     <ProtectWindows xmlns="urn:schemas-microsoft-com:office:spreadsheet">False<"/ProtectWindows> 
    </ExcelWorkbook> 
    <Styles> 
     <Style ss:ID="s21"> 
      <NumberFormat ss:Format="Percent"/> 
     </Style> 
     <Style ss:ID="s22"> 
      <NumberFormat ss:Format="[ENG][$-409]d\-mmm\-yyyy;@"/> 
     </Style> 
     <Style ss:ID="s23"> 
      <NumberFormat ss:Format="mm/dd/yyyy;@"/> 
     </Style> 
     <Style ss:ID="s24"> 
      <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/> 
      <Font x:Family="Swiss" ss:Bold="1"/> 
     </Style> 
     <Style ss:ID="Default" ss:Name="Normal"> 
      <Alignment ss:Vertical="Bottom"/> 
      <Borders/> 
      <Font/> 
      <Interior/> 
      <NumberFormat/> 
      <Protection/> 
     </Style> 
    </Styles> 
    <Worksheet ss:Name="SomeSheetName"> 
     <Table ss:ExpandedColumnCount="33" ss:ExpandedRowCount="5768" x:FullColumns="1" x:FullRows="1"> 
      <Column ss:Width="111"/> 
       <Row> 
        <Cell ss:StyleID="s24"> 
         <Data ss:Type="String">ABCD<"/Data> 
        </Cell> 
        <Cell ss:StyleID="s24"> 
         <Data ss:Type="String">ABCD<"/Data> 
        </Cell> 
        <Cell ss:StyleID="s24"> 
         <Data ss:Type="String">ABCD<"/Data> 
        </Cell> 
        <Cell ss:StyleID="s24"> 
         <Data ss:Type="String">ABCD<"/Data> 
        </Cell> 
        <Cell ss:StyleID="s24"> 
         <Data ss:Type="String">ABCD<"/Data> 
        </Cell> 
       </Row> 
      </Column> 
     </Table> 
     <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
      <Selected/> 
      <ProtectObjects>False<"/ProtectObjects> 
      <ProtectScenarios>False<"/ProtectScenarios> 
     </WorksheetOptions> 
    </Worksheet> 
</Workbook> 

Espero que esto ayude.

0

Como se mencionó anteriormente, la manera más fácil de exportar datos a excel es generar texto o presentación xml. En cuanto a mí, prefiero usar el motor de plantillas de texto SpreadSheetML y T4 para la generación de archivos. Puede echar un vistazo al archivo T4 de muestra aquí: http://lilium.codeplex.com/SourceControl/changeset/view/40985#803959.

Si decide utilizar T4, tenga en cuenta que T4 es parte de MS Visual Studio y NO PUEDE distribuirlo por separado. El problema se puede resolver instalando Visual Studio Express Edition en la máquina de destino.

Alternativamente, puede utilizar el motor de plantillas aspx incorporado, utilizado para la generación de clases de vista aspx. Observe cómo se hace aquí [oops, no me permite publicar más hipervínculos, si todavía está interesado, hágamelo saber] (tenga en cuenta que esta es una aplicación del mundo real, por lo que el código es bastante grande y sucio). El motor Aspx maneja la etiqueta Style de su propia manera, por lo que tendrá que usar un nombre calificado para que funcione, el formateo automático en Visual Studio tampoco funcionará correctamente.

3

Puede insertarlo en la hoja de cálculo de Excel utilizando la misma técnica que se identifica en el artículo vinculado.

sólo tiene que utilizar el siguiente código de pseudo

try 
{ 
    System.Data.OleDb.OleDbConnection MyConnection ; 
    System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(); 
    string sql = null; 
    MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\\csharp.net-informations.xls';Extended Properties=Excel 8.0;"); 
    MyConnection.Open(); 
    myCommand.Connection = MyConnection; 

    myCommand.CommandText = "Insert into [Sheet1$] (id,name) values('@p1', '@p2')"; 
    myCommand.Parameters.Add("@p1", OleDbType.VarChar, 100); 
    myCommand.Parameters.Add("@p2", OleDbType.VarChar, 100); 

    // define query to entity data model 
    var model = from i in myEntity.Inquiries select i; 

    foreach(var m in model) 
    {  
     cmd.Parameters["@p1"].Value = m.RequestID; 
     cmd.Parameters["@p2"].Value = m.CustomerName; 
     // .. Add other parameters here 
     cmd.ExecuteNonQuery(); 
    } 
    } 
1

Puede usar el reflejo para obtener una lista de propiedades, luego use esa lista de propiedades (y reflexión) para conectar el resultado de su consulta a un ADO.Net DataTable antiguo. DataTable tiene WriteXML, que se puede usar para almacenar un archivo XML temporal en la carpeta temp (usando System.IO). Entonces simplemente use OpenXML en la aplicación de Excel.

Tengo muestras de código en http://social.msdn.microsoft.com/Forums/en-US/whatforum/thread/69869649-a238-4af9-8059-55499b50dd57 si desea probar este enfoque.IMO esto parece ser el más rápido (al menos, mucho más rápido que intentar escribir directamente en Excel), más fácil (al menos, mucho más fácil que tratar de convertir tu consulta a algún formato XML por tu cuenta), y el método más reutilizable (Además, en la muestra del código estamos vinculados de forma tardía, por lo que puede desarrollarse en un entorno mixto suponiendo al menos Excel 2003).

Cuestiones relacionadas