在我的MVC 5网站中,我有一个稳定的导出到Excel功能,但用户要求我使列标题“#34;用户友好。”#34;
在我的模型中,我使用[Display(Name="Friendly Column Name")]
注释,它们在View页面上按预期显示,但是当用户触发导出功能时,它们不会转移到导出的Excel文件。相反,真实的名字出现了。
我知道我可以通过 LoadFromCollection 之外的其他方法加载工作表单元格,但我想知道是否仍然可以使用 LoadFromCollection 并使用模型&#39 ; s显示(名称())注释。
这就是我目前所拥有的:
public ActionResult ExportToExcel(string _selectedCampus)
{
// This is the query result set the user wishes to export to file.
IEnumerable<Mia1aSec1FayExport> exportQuery = unitOfWork
.Mia1aSec1FayRepository.Get().Select(n => new Mia1aSec1FayExport
{
Campus = n.Campus,
StudentName = n.StudentName,
CreditsBeforeSchoolYear = n.CreditsBeforeSchoolYear,
CreditsDuringSemester1 = n.CreditsDuringSemester1,
EligibleFayCount = n.EligibleFayCount,
EligibleFayMeetingGoal = n.EligibleFayMeetingGoal
}).Where(n => n.Campus == _selectedCampus).OrderBy(n => n.StudentName)
.AsEnumerable();
// The current iteration saves the table contents, but without the
// [Display{Name"xxx)] annotation from the model.
byte[] response;
using (var excelFile = new ExcelPackage())
{
excelFile.Workbook.Properties.Title = "MIA 1A (i) Eligible FAY Students";
var worksheet = excelFile.Workbook.Worksheets.Add("Sheet1");
worksheet.Cells["A1"]
.LoadFromCollection(Collection: exportQuery, PrintHeaders: true);
response = excelFile.GetAsByteArray();
}
// Save dialog appears through browser for user to save file as desired.
return File(response, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Mia1aSec1Fay.xlsx");
}
解决方法是覆盖标题单元格,但这是不可取的,原因有两个:(1)我已经在模型中将列名称写为注释,这意味着我现在在两个不同的地方写入相同的信息, (2)我必须手动保持信息同步,以防用户想要更改,我可能会忘记这样做。
// This loads teh table as seen by the user in the index view.
worksheet.Cells["A1"].LoadFromCollection(Collection: exportQuery, PrintHeaders: true);
// Workaround overwrite header cells, as I'm not able to use Display Name annotation.
worksheet.Cells[1, 1].Value = "Campus";
worksheet.Cells[1, 2].Value = "Student Name";
worksheet.Cells[1, 3].Value = "Credits Before SY";
worksheet.Cells[1, 4].Value = "Credits During Semester 1";
worksheet.Cells[1, 5].Value = "Legible Population";
worksheet.Cells[1, 6].Value = "Eligible Students Earning 2+ Credits";
正如所写,我真的希望这不是唯一的选择。必须有一种方法可以在标题中写入显示名称值而不是真实名称。
答案 0 :(得分:13)
LoadFromCollection 仅响应DisplayName
或Description
属性,而不响应Display
属性。
因此,您可以尝试将其中一个属性添加到当前属性中。
[DisplayName("Friendly Column Name")]
[Display(Name = "Friendly Column Name")]
public string StudentName { get; set; }
还要确保在调用 LoadFromCollection 时将PrintHeaders参数设置为true,但是你说真实的名字出现了,所以可能已经没问题了。
答案 1 :(得分:0)
#将记录导出到csv文件中。
1.使用标题创建模型类
public class EmployeeDetails
{
[Name("ID")]
public string id{ get; set; }
[Name("Name")]
public string name{ get; set; }
[Name("Designation")]
public string designation{ get; set; }
}
2。使用CSV Helper类导出
var data = new EmployeeDetails();
List<EmployeeDetails> rows = new List<EmployeeDetails>() { data };
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.CurrentCulture))
{
csvWriter.WriteHeader(typeof(EmployeeDetails));
csvWriter.NextRecord();
csvWriter.WriteRecords(rows);
csvWriter.Flush();
streamWriter.Flush();
memoryStream.Position = 0;
return memoryStream;
}