问题
I am trying to filter the rows that are sent to a excel file. I have been able to figure out how to export row data to excel, but now I need to send filtered data to an excel sheet since I added a version dropdown. What happens is I select the version I want to see from the dropdown.
Ex. the version is 12.1.
The view will only bring back data that has a version number 12.1 associated with it. Now when I want to download the filtered rows in an excel file. I press the download to excel file button and it open the file in a excel file except it brings all the rows instead of the filtered rows. I thought that all I had to do was add the appropriate viewbag and viewdata variables to the call and it would work, no such luck, it still keeps bringing every row. Could you guys take a look at my code and help me figure out what I am doing wrong? I have posted the code below please let me know if you need more information for better diagnosis, I will be checking back often! Thanks for your help!
Excel Controller
[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 Output View
@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>
Index View
<!--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
@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
@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>
回答1:
Try this Code Worked Excel using Interop....
Code:
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;
}
}
回答2:
Ok, I know I just posted this question an hour ago but I figured it out and hopefully others will find this answer helpful if they are having the same problem. The problem with my excel call was that was that it had to many variables.
The Action link for the download button looked like this before
<div class="righty">
@Html.ActionLink("Download in Excel Format", "PaExcelOutput", "Pa", new { VERS = ViewBag.SelectedVersion, currentFilter = ViewBag.currentFilter, sortOrder = ViewBag.CurrentSort, @class = "button1" })
</div>
I changed it to this
<div class="righty">
@Html.ActionLink("Download in Excel Format", "PaExcelOutput", new { VERS = ViewBag.SelectedVersion, currentFilter = ViewBag.currentFilter, sortOrder = ViewBag.CurrentSort }, new { @class = "button1" })
</div>
By removing the "Pa"
from the sentence I removed the extra variable that was causing the viewbags to not pass the variable to the excel output.
The actionlink method should look like the following
ActionLink(HtmlHelper, String, String, Object, Object)
Now I know... and knowing is half the battle!
回答3:
<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>
来源:https://stackoverflow.com/questions/11453714/filter-excel-output-using-mvc-3