使用MVC 3过滤Excel输出

时间:2012-07-12 14:10:48

标签: asp.net-mvc-3 export-to-excel viewdata viewbag

我正在尝试过滤发送到excel文件的行。我已经能够弄清楚如何将行数据导出到excel,但现在我需要将过滤后的数据发送到excel表,因为我添加了一个版本下拉列表。会发生什么是我从下拉列表中选择我想要查看的版本。

实施例。版本是12.1。

该视图仅会返回与其关联的版本号为12.1的数据。现在,当我想在excel文件中下载过滤的行时。我按下下载到excel文件按钮,它在excel文件中打开文件,除了它带来所有行而不是过滤的行。我认为我所要做的就是将相应的viewbag和viewdata变量添加到调用中,它会起作用,没有这样的运气,它仍然会保持每一行。你们可以看看我的代码并帮我弄清楚我做错了什么吗?我已经发布了以下代码,如果您需要更多信息以便更好地诊断,请告诉我,我会经常回来查看!谢谢你的帮助!

Excel控制器

[Authorize]
        public ActionResult PaExcelOutput(string sortField, string currentFilter, string searchString, int? page, string VERS)
        {

            int pageNumber = (page ?? 1); // start page number

            var PaExcel = from P in db.iamp_mapping
                          select P;


            ViewBag.CurrentField = sortField = String.IsNullOrEmpty(sortField) ? "IAMP_PK" : sortField; // Provides the field to sort
            ViewBag.CurrentFilter = searchString; // Provides the view with the current filter string

            ViewData["SelectedVersion"] = VERS;
            ViewData["currentFilter"] = currentFilter;
            ViewData["VERS"] = new SelectList(PaExcel.Select(x => x.VERSION).Distinct());

            if (!String.IsNullOrEmpty(VERS))
            {
                PaExcel = PaExcel.Where(p => p.VERSION.ToUpper().Contains(VERS));
            }

            if (Request.HttpMethod == "GET")
            {
                searchString = currentFilter; //sets the currentFilter equal to Searchstring
            }

            else
            {
                page = 1;                   // defaults to page 1
            }




            return View(PaExcel);
        }

Excel输出视图

@model IEnumerable<DBFirstMVC.Models.iamp_mapping>

<!--This is what the MVC uses to output the correct rows to Excel -->

@{
    Layout = null;
    Response.AddHeader("Content-Type", "application/vnd.ms-excel");  
}




<table>
    <tr>
        <th>
            PA
        </th>
        <th>
            VERSION
        </th>
        <th>
            INVESTMENT AREA
        </th>
        <th>
            MAJOR PROGRAM
        </th>
        <th>
            PA SUB PROGRAM
        </th>
        <th>
            VP
        </th>
        <th>
            DIRECTOR
        </th>
        <th>
            SPA
        </th>
        <th>
            PA INITIATIVE
        </th>
        <th>
            NOTES
        </th>
        <th>
            TEAM BC
        </th>
        <th>
            PA CC
        </th>
        <th>
            PA DESCRIPTION
        </th>
        <th>
            PA MANAGER
        </th>
        <th>
            SPA CC
        </th>
        <th>
            TIER 1
        </th>
        <th>
            TIER 2
        </th>
        <th>
            TIER 3
        </th>
        <th>
            TIER 4
        </th>
        <th>
            CFP VIEW NV/NONNV
        </th>
        <th>
            CFP VIEW
        </th>
        <th>
            CREATION DATE
        </th>
        <th>
            CAF PROJECT NAME
        </th>
        <th>
            CAF IA
        </th>
        <th>
            CAF MP
        </th>
        <th>
            CAF LEAD DIR
        </th>
        <th>
            CAF LEAD MGR
        </th>
        <th>
            CAF CC DIR
        </th>
        <th>
            CAF CC MGR
        </th>
        <th>
            CAF CC
        </th>
        <th>
            CAF ID
        </th>
        <th>
            CREATED ON
        </th>
        <th>
            LAST EDITED
        </th>
        <th>
            PROJECT STATUS
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.PA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.VERSION)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.INVESTMENT_AREA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MAJOR_PROGRAM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PA_SUB_PROGRAM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.VP)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DIRECTOR)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SPA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PA_INITIATIVE)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NOTES)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TEAM_BC)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PA_CC)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PA_DESCRIPTION)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PA_MANAGER)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SPA_CC)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TIER_1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TIER_2)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TIER_3)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TIER_4)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CFP_VIEW_NV_NONNV)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CFP_VIEW)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CREATION_DATE)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_PROJECT_NAME)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_IA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_MP)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_LEAD_DIR)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_LEAD_MGR)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_CC_DIR)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_CC_MGR)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_CC)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAF_ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CREATED_ON)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LAST_EDITED)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PROJECT_STATUS)
        </td>

    </tr>
}

</table>

索引视图

<!--For stack overflow, This is where the actionlink that the download to excel button is located it is at the bottom of this code snippet called PAExcelOutput-->


@model PagedList.IPagedList<DBFirstMVC.Models.iamp_mapping>


@{
    ViewBag.Title = "PA Mapping";

}

@using PagedList;


<h2 class="corporate sifr">@ViewBag.Title</h2>


<div class="crossband">
@using (Html.BeginForm())
{

    <div class="lefty">        
        Filter by Version: @Html.DropDownList("VERS", null, "All", new { @class = "text" }) and by Criteria: @Html.TextBox("SearchString", "", new { @class = "text" })        
    </div>    
    <input type = "submit" class = "button1" value = "Go" />
}

<div class="righty">
    @Html.ActionLink("Add a new PA to the database", "Create", "Pa", null, new { @class = "button1" })

</div>
</div>

<div class="crossband">
    <div class="lefty">   
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount
    &nbsp;&nbsp;&nbsp;&nbsp;
    @if (Model.HasPreviousPage)
    {
        @Html.ActionLink("<<", "", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
        @Html.Raw(" ");
        @Html.ActionLink("< Prev", "", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
    }
    else
    {
        @:<<
        @Html.Raw(" ");
        @:< Prev
    }

    @if (Model.HasNextPage)
    {
        @Html.ActionLink("Next >", "", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
        @Html.Raw(" ");
        @Html.ActionLink(">>", "", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
    }
    else
    {
        @:Next >
        @Html.Raw(" ")
        @:>>
    }
    </div>
    <div class="righty">
        Showing Records @Model.FirstItemOnPage to @Model.LastItemOnPage from @Model.TotalItemCount records
    </div>
</div>


<table>
    <tr>
        <th>
            @Html.ActionLink("PA", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "PA", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "PA")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "PA")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}
        </th>
        <th>        
            @Html.ActionLink("MAJOR PROGRAM", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "MAJOR_PROGRAM", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "MAJOR_PROGRAM")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "MAJOR_PROGRAM")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}           
        </th>
        <th>
            @Html.ActionLink("INVESTMENT AREA", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "INVESTMENT_AREA", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "INVESTMENT_AREA")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "INVESTMENT_AREA")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}   
        </th>
        <th>
            @Html.ActionLink("Version", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "VERSION", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "VERSION")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "VERSION")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}   
        </th>
        <th>
            @Html.ActionLink("VP/SR. DIRECTOR", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "VP", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "VP")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "VP")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}   
        </th>
        <th>
            @Html.ActionLink("DIRECTOR/SR. MGR", "", new { sortOrder = ViewBag.currentOrder == "asc" ? "desc" : "asc", sortField = "DIRECTOR", VERS = ViewBag.SelectedVersion })
            @if (ViewBag.currentOrder == "asc" && ViewBag.CurrentField == "DIRECTOR")
            {<img id="asc" src="@Url.Content("~/Images/ico_tablesortoffset_asc.gif")" alt = "Asc Arrow" />}
            @if (ViewBag.currentOrder == "desc" && ViewBag.CurrentField == "DIRECTOR")
            {<img id="desc" src="@Url.Content("~/Images/ico_tablesortoffset_desc.gif")" alt = "Desc Arrow" />}   
        </th>       
        <th></th>
    </tr>
@{
    var row_class = "odd";
}

@foreach (var item in Model)
{
    row_class = row_class == "odd" ? "even" : "odd";    
    <tr class="@row_class">
        <td>
            @Html.DisplayFor(modelItem => item.PA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MAJOR_PROGRAM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.INVESTMENT_AREA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.VERSION)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.VP)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DIRECTOR)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.IAMP_PK }) |

            @Html.ActionLink("Delete", "Delete", new { id = item.IAMP_PK })
        </td>
    </tr>
}

</table>

<div class="crossband">
    <div class="lefty">
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount
    &nbsp;&nbsp;&nbsp;&nbsp;
    @if (Model.HasPreviousPage)
    {
        @Html.ActionLink("<<", "", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
        @Html.Raw(" ");
        @Html.ActionLink("< Prev", "", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
    }
    else
    {
        @:<<
        @Html.Raw(" ");
        @:< Prev
    }

    @if (Model.HasNextPage)
    {
        @Html.ActionLink("Next >", "", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
        @Html.Raw(" ");
        @Html.ActionLink(">>", "", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, VERS = ViewBag.SelectedVersion })
    }
    else
    {
        @:Next >
        @Html.Raw(" ")
        @:>>
    }
    </div>
    <div class="righty">
    Showing Records @Model.FirstItemOnPage to @Model.LastItemOnPage from @Model.TotalItemCount records
    </div>
</div>
<br/><br/>
<div class="righty">
@Html.ActionLink("Download in Excel Format", "PaExcelOutput", "Pa", new { VERS = ViewBag.SelectedVersion, currentFilter = ViewBag.currentFilter, sortOrder = ViewBag.CurrentSort, @class = "button1" })

</div>

3 个答案:

答案 0 :(得分:1)

尝试使用此代码 Excel使用Interop ....

代码:

private System.Data.DataTable GetExcelData(string fileName)
        {
            Application excelApp = null;
            Workbook excelWorkBook = null;
            Worksheet excelSheet;
            Range range;

            try
            {
                //creat a Application object
                excelApp = new Application();

                //   get   WorkBook  object
                excelWorkBook = excelApp.Workbooks.Open(fileName, Missing.Value, Type.Missing,
                        Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Missing.Value);

                //   get   WorkSheet object
                excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkBook.Sheets[1];



                int columnCount = excelSheet.UsedRange.Columns.Count;

                excelSheet.Columns.ClearFormats();
                excelSheet.Rows.ClearFormats();

                columnCount = excelSheet.UsedRange.Columns.Count;
                int rowsCount = excelSheet.UsedRange.Rows.Count;

                Range last = excelSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
                range = excelSheet.get_Range("A2", last);
                object[,] values = (object[,])range.get_Value(Type.Missing);

                System.Data.DataTable dt = new System.Data.DataTable("TicketUpload");
                for (int c = 1; c <= columnCount; c++)
                {
                    if (excelSheet.Cells[1, c].Value2 != null)
                    {
                        string columnName = excelSheet.Columns[c].Address;
                        Regex reg = new Regex(@"(\$)(\w*):");
                        if (reg.IsMatch(columnName))
                        {
                            Match match = reg.Match(columnName);
                            dt.Columns.Add(Convert.ToString(excelSheet.Cells[1, c].Value2).ToUpper(), typeof(string));
                        }
                    }
                }

                for (int i = 1; i <= values.GetLength(0); i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 1; j <= dt.Columns.Count; j++)
                    {
                        if (values[i, j] == null)
                            dr[j - 1] = DBNull.Value;
                        else
                            dr[j - 1] = values[i, j];
                    }
                    dt.Rows.Add(dr);
                }

                range = null;
                excelSheet = null;
                if (excelWorkBook != null)
                    excelWorkBook.Close(false, Missing.Value, Missing.Value);
                excelWorkBook = null;
                if (excelApp != null)
                    excelApp.Quit();
                excelApp = null;

                return dt;

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                range = null;
                excelSheet = null;
                if (excelWorkBook != null)
                    excelWorkBook.Close(false, Missing.Value, Missing.Value);
                excelWorkBook = null;
                if (excelApp != null)
                    excelApp.Quit();
                excelApp = null;
            }
        }

答案 1 :(得分:0)

好的,我知道我刚刚在一小时前发布了这个问题,但我想出来了,希望其他人会发现这个答案有用,如果他们遇到同样的问题。我的excel调用的问题在于它有许多变量。

下载按钮的Action链接在

之前显示如下
<div class="righty">
@Html.ActionLink("Download in Excel Format", "PaExcelOutput", "Pa", new { VERS = ViewBag.SelectedVersion, currentFilter = ViewBag.currentFilter, sortOrder = ViewBag.CurrentSort, @class = "button1" })

</div>

我把它改成了

<div class="righty">

@Html.ActionLink("Download in Excel Format", "PaExcelOutput", new { VERS = ViewBag.SelectedVersion, currentFilter = ViewBag.currentFilter, sortOrder = ViewBag.CurrentSort }, new { @class = "button1" })

</div>

通过从句子中删除"Pa",我删除了导致视图包未将变量传递给excel输出的额外变量。

actionlink方法应如下所示

ActionLink(HtmlHelper, String, String, Object, Object)

现在我知道了...知道是战斗的一半!

答案 2 :(得分:0)

<div class="toggle-contents">
        <table width="100%" id="qualitygoal">
            <tr>
                <td class="even" align="left">
                    @Html.Label("Project Id")
                </td>
                <td class="even" align="left">
                    @ViewBag.ProjectId
                </td>

            </tr>
            <tr>

                <td class="even" align="left">
                    @Html.Label("Project Name")
                </td>
                <td class="even" align="left">
                    @ViewBag.ProjectName
                </td>

            </tr>
            <tr>
                     <td class="even" align="left">
                    @Html.Label("Upload File")
                </td>
                <td class="even" align="left">
                <input type="file" name="file" /><br />
                </td>
                     </tr>
        </table>
        <table width="100%" id="goal">


            @using (Html.BeginForm("Index", "TicketDataUpload", FormMethod.Post, new { enctype = "multipart/form-data" }))
            { 

                <br />

                <div align="right">
                    <input type="submit" name="Submit" id="Submit" value="Upload" />
                    <input type="submit" name="Submit" value="NewTemplate" class="Add" id="NewTemplate" />
                    <input type="button" value="Close" class="cancel" />

                </div>
            }


        </table>
    </div>