2010-02-04 82 views
8

我的數據來自我的ASP.NET頁面上的實體數據模型表。 現在我必須將這些數據導出到按鈕點擊的Excel中。如何使用LINQ to Entity將數據導出到Excel?

如果使用OLEDB,它是直線前進,因爲它是在這裏:http://csharp.net-informations.com/excel/csharp-excel-oledb-insert.htm

這裏是我的函數從查詢表中讀取數據:

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 – 2010-02-05 13:38:19

回答

1

你可以隨便寫的字符串表示您的數據 - 製表符分隔每個字段,\ r \ n爲每行分隔。然後將其作爲一個.csv文件流出瀏覽器,該文件將在Excel中自動打開。

+0

我找到了解決方案。幹得好。 http://stackoverflow.com/questions/1932568/exporting-a-html-table-to-excel – Rita 2010-02-05 17:41:22

+0

你也可以看看這裏:http://stackoverflow.com/questions/151005/create-excel-xls -and-XLSX-文件從-C / – 2010-02-28 20:33:32

0

你可以考慮使用SpreadSheetML,基本上這是一個XML文件,在xml文件的頂部提到一個Cocoon進程,通過雙擊xml文件啓動excel應用程序。 SpreadSheetML的示例如下所示。

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

希望這會有所幫助。

0

如前所述,將數據導出到excel最簡單的方法是生成文本或xml表示。至於我,我更喜歡使用SpreadSheetML和T4文本模板引擎來生成文件。你可以在這裏看一下T4樣本文件:http://lilium.codeplex.com/SourceControl/changeset/view/40985#803959

如果您決定使用T4,請記住T4是MS Visual Studio的一部分,您不得單獨分發它。該問題可以通過在目標機器上安裝Visual Studio Express Edition來解決。

或者,您可以使用內置的aspx模板引擎,用於aspx視圖類的生成。看看它是如何完成的[哎呀,它不允許我發佈更多的超鏈接,如果你仍然感興趣,請告訴我](請注意,這是一個真實世界的應用程序,所以代碼非常大且很髒)。 Aspx引擎以自己的方式處理樣式標籤,因此您必須使用限定名稱才能使其工作,Visual Studio中的自動格式化也無法正常工作。

3

您仍然可以使用鏈接文章中標識的相同技術插入到Excel電子表格中。

只需使用下面的僞代碼

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

您可以使用反射來獲取屬性列表,然後使用該屬性列表(和反射)將查詢結果插入舊的ADO.Net DataTable中。 DataTable具有WriteXML,可用於將臨時XML文件存儲在臨時文件夾中(使用System.IO)。然後只需在Excel應用程序中使用OpenXML。

如果您想嘗試這種方法,我的代碼示例爲http://social.msdn.microsoft.com/Forums/en-US/whatforum/thread/69869649-a238-4af9-8059-55499b50dd57。IMO似乎是最快的(至少比直接寫入Excel的速度快得多),最簡單的(至少,試圖自己將查詢轉換爲某種XML格式要容易得多),以及大多數可重用的方法(另外在代碼示例中,我們遲到了綁定,所以您可以針對混合環境進行開發,至少使用Excel 2003)。