экспорт данных модели в Excel mvc

#asp.net #asp.net-mvc-3

#asp.net #asp.net-mvc-3

Вопрос:

 @model SA.MarketingManager.WebClient.Areas.Reports.Models.ViewReportModel
@{
    Layout = "~/CustomViews/lennoxcap.net/Shared/_DealerLayout.cshtml";
}
@using (Html.BeginForm())
{
    <div style="width: 100%; font-size: 9px;" id="results">
        <h3  style="background-color: #CC0000; color: #fff; font-size: 1.5em;">
            Customer Survey Report</h3>
        @if (Model.Report.Count() > 0)
        {
            <table id="SurveyResponse" width="100%" cellpadding="0" cellspacing="0">
                <thead>
                    <tr class="header">
                        <td>
                            Dealer #
                        </td>
                        <td>
                            District
                        </td>
                        <td>
                            TM
                        </td>
                        <td>
                            Survey Code
                        </td>
                        <td>
                            First Name
                        </td>
                        <td>
                            Last Name
                        </td>
                        <td>
                            Address
                        </td>
                        <td>
                            City
                        </td>
                        <td>
                            State
                        </td>
                        <td>
                            Postal Code
                        </td>
                        <td>
                            Phone
                        </td>
                        <td>
                            Mail Sent
                        </td>
                        <td>
                            Email Sent
                        </td>
                    </tr>
                </thead>
                <tbody>
                    @{bool alternate = false;}
                    @foreach (var tr in Model.Report)
                    {
                        <tr @(alternate ? "class=alternate" : "")>
                            <td>
                                @tr.DealerId
                            </td>
                            <td>
                                @tr.District
                            </td>
                            <td>@tr.TM
                            </td>
                            <td>@tr.SurveyCode
                            </td>
                            <td>@tr.FirstName
                            </td>
                            <td>@tr.LastName
                            </td>
                            <td>@tr.Address
                            </td>
                            <td>@tr.City
                            </td>
                            <td>@tr.State
                            </td>
                            <td>@tr.PostalCode
                            </td>
                            <td>@tr.Phone
                            </td>
                            <td>@tr.MailSent
                            </td>
                            <td>@tr.DateCompleted
                            </td>
                        </tr>
                           alternate = !alternate;
                    }
                </tbody>
            </table>
        }
        else
        {
            <text>There are no records to display</text>
        }
        <p>
            <input type="submit" id="Submit" value="Export Data" class="PremierSubmitButton" />
       </p>
    </div>
  

контроллер

 public ActionResult CustomerReport()
    { 
        ViewReportModel model = new ViewReportModel();
            var query = (from u in SessionHandler.CurrentContext.LennoxSurveyResponses
                            join c in SessionHandler.CurrentContext.MailingListEntries on u.SurveyCode equals c.SurveyCode
                            join cl in SessionHandler.CurrentContext.MailingLists on c.MailingListId equals cl.MailingListId
                            join ch in SessionHandler.CurrentContext.Channels on cl.ChannelId equals ch.ChannelId
                            join cg in SessionHandler.CurrentContext.ChannelGroups on ch.ChannelGroupId equals cg.ChannelGroupId
                            //let con = ch.Contacts.FirstOrDefault()
                            where ch.OrganizationId == 8
                            //amp;amp; con.ContactTypeId == ContactTypeConstants.TMId
                            //select new ReportDetails() { SurveyResponse = u, MailingListEntry = c, Channel = cl.Channel, Contact = con }); 
                            select new ReportDetails{   DealerId = ch.ExternalChannelId,
                                                        District = ch.ChannelAMSData.District,
                                                        TM = cg.Name,
                                                        SurveyCode = u.SurveyCode,
                                                        FirstName = c.FirstName,
                                                        LastName = c.LastName,
                                                        Address = c.Address1,
                                                        City = c.City,
                                                        State = c.State,
                                                        PostalCode = c.PostalCode,
                                                        Email = c.Email,
                                                        Phone = c.Phone,
                                                        MailSent = c.LetterDate,
                                                        DateCompleted = c.EmailDate});
               model.Report = query;
               return View("CustomerReport", model);
    }
    [HttpPost]
    public ActionResult CustomerReport(ViewReportModel model)
    {
        var query = (from u in SessionHandler.CurrentContext.LennoxSurveyResponses
                     join c in SessionHandler.CurrentContext.MailingListEntries on u.SurveyCode equals c.SurveyCode
                     join cl in SessionHandler.CurrentContext.MailingLists on c.MailingListId equals cl.MailingListId
                     join ch in SessionHandler.CurrentContext.Channels on cl.ChannelId equals ch.ChannelId
                     join cg in SessionHandler.CurrentContext.ChannelGroups on ch.ChannelGroupId equals cg.ChannelGroupId
                     where ch.OrganizationId == 8
                     select new ReportDetails
                     {
                         DealerId = ch.ExternalChannelId,
                         District = ch.ChannelAMSData.District,
                         TM = cg.Name,
                         SurveyCode = u.SurveyCode,
                         FirstName = c.FirstName,
                         LastName = c.LastName,
                         Address = c.Address1,
                         City = c.City,
                         State = c.State,
                         PostalCode = c.PostalCode,
                         Email = c.Email,
                         Phone = c.Phone,
                         MailSent = c.LetterDate,
                         DateCompleted = c.EmailDate
                     });
        model.Report = query;
        return new Utilities.ExcelResult<ViewReportModel>(
            ControllerContext,
            "~/ExcelReport.aspx",
            "CustomerReport.xls",
            model
            );
    }
  

Моя модель ReportsModel.cs

 public class ReportDetails 
{
    public string DealerId { get; set; }
    public string District { get; set; }
    public string TM { get; set; }
    public string SurveyCode { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public DateTime? MailSent { get; set; }
    public DateTime? DateCompleted { get; set; }
}

public class ViewReportModel : PageModel
{
    public IEnumerable<ReportDetails> Report { get; set; }
    public string Results { get; set; }
}
  

Ответ №1:

Я написал небольшой пост в блоге об этом здесь:http://landokal.wordpress.com/2011/04/28/asp-net-mvc-export-to-excel-trick /

По сути, что вы могли бы сделать, так это создать кнопку, которая отправляет содержимое одного из элементов на вашей странице и присваивает его свойству вашей модели, поэтому каждый раз, когда вы экспортируете это представление, ваш метод экспорта может проверять свойство модели вместо непосредственного отображения представления.

Также в сообщении приведены несколько примеров кода, как выполнить базовый экспорт в Excel в MVC, если вы не хотите идти другим путем.

Комментарии:

1. Привет, Сландау, у меня вопрос. Если я просмотрю данные в модели, как я смогу передать их вашему классу ExcelResult.public ActionResult CustomerReport (модель ViewReportModel) { возвращает новые утилиты. ExcelResult<База моделей>(ControllerContext, «Export.aspx», «ExcelExport», модель); } Я не могу найти базу моделей. Используя ваше решение, я должен быть в состоянии заставить это работать.

2. Вместо того, чтобы передавать «Export.aspx», вы хотите отключить этот параметр для строки, которую вы сохраняете, обратно в вашу модель сохраняемого вами HTML.

3. Это то, что у меня есть public ActionResult [HttpPost]CustomerReport(модель ViewReportModel) { возвращает новые утилиты. ExcelResult<Менеджер маркетинга. Веб-клиент. Модели. M> (ControllerContext, «Reports / Views / CustomerReport.cshtml», «ExcelExport», model.Report); } Выдает ошибку в ModelBase и model.Report.

4. Вам не следует передавать туда представление, если вы делаете это хитрым способом. Вы должны сохранять результаты просмотра в свойство вашей модели, а затем передавать эту строку.

5. Я изменил его на public ActionResult CustomerReport (модель ViewReportModel) { возвращает новые утилиты. ExcelResult<ViewReportModel>(ControllerContext, модель.Отчет. toString(), «ExcelExport», модель); } Теперь я получаю ошибку при возврате нового ExcelResult<ViewReportModel>.. Ссылка на объект не установлена для экземпляра объекта.