我在asp.net mvc中创建报表查看器。但我有2个表有关系,并在报表查看器中,当我导出报表时,其他表中的数据不仅仅是名称。例如我在Expense
水中
但是当我导出时,它不会显示在表格中。
这是我的模特:
public class Expenses
{
[Key]
public int Expenses_Id { get; set; }
public string Expenses_Type { get; set; }
}
public class ExpenseDetails
{
[Key]
public int ExpenseDetails_Id { get; set; }
public double Amount { get; set; }
public DateTime DateExpense { get; set; }
public int ExpensesId { get; set; }
[ForeignKey("ExpensesId")]
public virtual Expenses expenses { get; set; }
}
这是我的报告代码:
public ActionResult Reports(string ReportType)
{
LocalReport localreport = new LocalReport();
localreport.ReportPath = Server.MapPath("~/Reports/ExpenseReport.rdlc");
ReportDataSource reportDataSource = new ReportDataSource();
reportDataSource.Name = "ExpenseDataSet";
reportDataSource.Value = _context.ExpenseDetails.ToList();
localreport.DataSources.Add(reportDataSource);
string reportType = ReportType;
string mimeType;
string encoding;
string fileNameExtension;
if (reportType == "Excel")
{
fileNameExtension = "xlsx";
}
if (reportType == "Word")
{
fileNameExtension = "docx";
}
if (reportType == "PDF")
{
fileNameExtension = "pdf";
}
else
{
fileNameExtension = "jpg";
}
string[] streams;
Warning[] warnings;
byte[] renderedByte;
renderedByte = localreport.Render(reportType, "", out mimeType, out encoding, out fileNameExtension, out streams, out warnings);
Response.AddHeader("content-disposition", "attachment;filename = expens_report." + fileNameExtension);
return File(renderedByte, fileNameExtension);
}
谢谢。
您是否在.rdlc中刷新了数据集?如果在添加外键之前创建了它,则需要删除.rdlc数据集和数据源,然后创建一个新的。
如何创建DTO?有时,创建复杂的对象列表更容易,用您想要的数据填充它并将其发送到rdlc。在这种情况下,您需要与rdlc建立单独的项目并添加对主项目的引用。这允许您将DTO导入为对象。
List<ExpenseDetailsDTO> list = new List<ExpenseDetailsDTO>()
{
new ExpenseDetailsDTO
{
Amount = 10,
DateExpense = DateTime.UtcNow,
ExpenseDetails_Id = 1,
Expenses_Id = 1,
Expenses_Type = "asd"
},
new ExpenseDetailsDTO
{
Amount = 10,
DateExpense = DateTime.UtcNow,
ExpenseDetails_Id = 1,
Expenses_Id = 1,
Expenses_Type = "asd"
},
new ExpenseDetailsDTO
{
Amount = 10,
DateExpense = DateTime.UtcNow,
ExpenseDetails_Id = 1,
Expenses_Id = 1,
Expenses_Type = "asd"
},
new ExpenseDetailsDTO
{
Amount = 10,
DateExpense = DateTime.UtcNow,
ExpenseDetails_Id = 1,
Expenses_Id = 1,
Expenses_Type = "asd"
},
};
reportDataSource.Name = "testdatasource";
reportDataSource.Value = list;
localReport.DataSources.Add(reportDataSource);
这样的事情对我有用,至少在迁移旧API的过去4个月里。