如何使用LINQ to Entity将数据导出到Excel?

时间:2010-02-04 19:39:24

标签: c# asp.net excel linq-to-entities export-to-excel

我的数据来自我的ASP.NET页面上的实体数据模型表。 现在,我必须在点击按钮时将这些数据导出到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

7 个答案:

答案 0 :(得分: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 :(得分:1)

您只需编写数据的字符串表示形式 - 为每个字段分隔的制表符,并为每行分隔\ r \ n。然后将其作为.csv文件从浏览器中流出,该文件将在Excel中自动打开。

答案 2 :(得分: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)。

答案 3 :(得分: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>

希望这有帮助。

答案 4 :(得分: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视图类。看看它是如何在这里完成的[oops,它不允许我发布更多的超链接,如果你仍然感兴趣,请告诉我们](请注意,这是一个真实世界的应用程序,所以代码非常大而且很脏)。 Aspx引擎以自己的方式处理Style标签,因此您必须使用限定名称才能使其工作,Visual Studio中的自动格式化也无法正常工作。

答案 5 :(得分:0)

您可以使用开源NPOI库来写出excel,doc,powerpoint等

答案 6 :(得分:0)

简单的方法是绑定网格视图并将其导出,请参阅http://aspalliance.com/771(首先使用google查找esample)