2010-02-04 4 views
8

J'ai les données provenant du tableau Entity Data model sur ma page ASP.NET. Maintenant, je dois exporter ces données dans Excel en cliquant sur le bouton.Comment exporter des données vers Excel en utilisant LINQ to Entity?

Si elle utilise OLEDB, il est simple comme ici: http://csharp.net-informations.com/excel/csharp-excel-oledb-insert.htm

Voici ma fonction pour lire les données à partir du tableau de renseignements:

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 –

Répondre

1

Vous pouvez simplement écrire une représentation de chaîne de vos données - onglet délimité pour chaque champ et \ r \ n délimité pour chaque ligne. Ensuite, diffusez le navigateur en tant que fichier .csv, qui s'ouvrira automatiquement dans Excel.

+0

J'ai trouvé la solution. Voici. http://stackoverflow.com/questions/1932568/exporting-a-html-table-to-excel – Rita

+0

Vous pouvez également jeter un oeil ici: http://stackoverflow.com/questions/151005/create-excel-xls -et-xlsx-fichier-de-c / –

0

Vous pouvez utiliser SpreadSheetML, qui est en fait un fichier XML avec un processus Cocoon mentionné au début du fichier xml pour lancer l'application Excel en double-cliquant sur le fichier xml. Échantillon pour SpreadSheetML fourni comme ci-dessous.

<?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> 

Hope this helps.

0

Comme mentionné précédemment, la manière la plus simple d'exporter des données vers Excel est de générer du texte ou une présentation XML. Pour ma part, je préfère utiliser SpreadSheetML et le moteur de modélisation de texte T4 pour la génération de fichiers. Vous pouvez jeter un oeil sur l'exemple de fichier T4 ici: http://lilium.codeplex.com/SourceControl/changeset/view/40985#803959.

Si vous décidez d'utiliser T4, gardez à l'esprit que T4 est la partie de MS Visual Studio et que vous NE POUVEZ PAS la distribuer séparément. Le problème peut être résolu en installant Visual Studio Express Edition sur la machine cible. Vous pouvez également utiliser le moteur de modélisation aspx intégré, utilisé pour la génération de classes d'affichage aspx. Jetez un oeil comment c'est fait ici [oups, il ne me permet pas de poster plus d'hyperliens, si vous êtes toujours intéressé, faites le moi savoir] (notez que c'est une application du monde réel si le code assez grand et sale). Le moteur Aspx gère les balises Style à sa manière, vous devrez donc utiliser un nom qualifié pour le faire fonctionner, la mise en forme automatique dans Visual Studio ne fonctionnera pas non plus correctement.

3

Vous pouvez toujours insérer dans la feuille de calcul Excel en utilisant la même technique que celle identifiée dans l'article lié.

Il suffit d'utiliser le code psuedo suivant

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

Vous pouvez utiliser la réflexion pour obtenir une liste de propriétés, puis utiliser cette liste de propriétés (et de réflexion) pour brancher le résultat de votre requête dans un ancien DataTable ADO.Net. DataTable a WriteXML, qui peut être utilisé pour stocker un fichier XML temporaire dans le dossier temporaire (using System.IO). Ensuite, utilisez simplement OpenXML dans l'application Excel.

J'ai des exemples de code à http://social.msdn.microsoft.com/Forums/en-US/whatforum/thread/69869649-a238-4af9-8059-55499b50dd57 si vous voulez essayer cette approche.IMO cela semble être le plus rapide (au moins, beaucoup plus rapide qu'essayer d'écrire directement à Excel), le plus facile (au moins, beaucoup plus facile alors en essayant de convertir votre requête au format XML par vous-même), et la méthode la plus réutilisable (plus dans l'exemple de code, nous avons une liaison tardive, de sorte que vous pouvez développer un environnement mixte en supposant au moins Excel 2003).

Questions connexes