Как экспортировать данные в Excel, используя LINQ to Entity? - PullRequest
8 голосов
/ 04 февраля 2010

У меня есть данные из таблицы модели Entity Data на моей странице 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 ]

3 голосов
/ 29 марта 2010

Вы по-прежнему можете вставить в электронную таблицу 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 голос
/ 23 октября 2012

Вы можете использовать отражение, чтобы получить список свойств, а затем использовать этот список свойств (и отражение), чтобы вставить результат вашего запроса в старую таблицу данных ADO.Net. DataTable имеет WriteXML, который можно использовать для хранения временного XML-файла во временной папке (с помощью System.IO). Затем просто используйте OpenXML в приложении Excel.

У меня есть примеры кода на http://social.msdn.microsoft.com/Forums/en-US/whatforum/thread/69869649-a238-4af9-8059-55499b50dd57, если вы хотите попробовать этот подход. IMO это кажется самым быстрым (по крайней мере, намного быстрее, чем попытка записи непосредственно в Excel), самым простым (по крайней мере, намного проще, чем попытка преобразовать ваш запрос в какой-то собственный формат XML) и наиболее пригодным для повторного использования методом (плюс в примере кода мы запаздываем, поэтому вы можете разрабатывать в смешанной среде, по крайней мере, в Excel 2003).

1 голос
/ 05 февраля 2010

Вы можете просто написать строковое представление ваших данных - табуляция с разделителями для каждого поля и \ r \ n с разделителями для каждой строки. Затем выполните потоковую передачу из браузера в виде файла .csv, который автоматически откроется в Excel.

0 голосов
/ 07 апреля 2010

Самый простой способ - связать вид сетки и экспортировать его, см. http://aspalliance.com/771 (первый пример поиска в Google)

0 голосов
/ 05 апреля 2010

Вы можете использовать библиотеку NPOI с открытым исходным кодом для записи Excel, DOC, PowerPoint и т. Д.

0 голосов
/ 22 марта 2010

Как упоминалось ранее, самый простой способ экспортировать данные в 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 также не будет работать правильно.

0 голосов
/ 10 марта 2010

Вы можете использовать SpreadSheetML, который в основном представляет собой XML-файл с процессом Cocoon, упомянутым поверх XML-файла, для запуска приложения Excel при двойном щелчке XML-файла.Пример для 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>

Надеюсь, это поможет.

...