ASP.NET Core MVC中ExportToPDF无法导出数据库数据问题排查
ASP.NET Core MVC导出PDF仅显示表头的问题解决
核心错误分析
- 数据源为空:
ExportToPDF方法里初始化了空的List<Employee>,完全没有从数据库的EmployeeCategories表读取数据,导致后续查询结果为空,自然无法生成数据行。同时代码混用了Employee和EmployeeCategory实体,需统一使用定义好的EmployeeCategory。 - 表头列重复:表头部分重复添加了
NetSalary和GrossSalary列,造成表头列数与数据列数不匹配。 - 编码隐患:使用
Encoding.ASCII会导致非ASCII字符(如中文)乱码,建议替换为UTF-8。
修正后的完整代码
public class EmployeeCategory { [Key] public int Id { get; set; } [Required] public string? Name { get; set; } [Required] public string? LastName { get; set; } [Required] public string? Address { get; set; } [Required] public double NetSalary { get; set; } [Required] public double GrossSalary { get; set; } } public class EmployeeCategoryController : Controller { private ApplicationDbContext Context { get; } public EmployeeCategoryController(ApplicationDbContext _context) { Context = _context; } public IActionResult Index() { return View(this.Context.EmployeeCategories.Take(6).ToList()); } [HttpPost] public FileResult ExportToPDF() { // 从数据库获取目标数据 var employees = Context.EmployeeCategories.Take(6).ToList(); var query = employees.Select(employee => new { employee.Id, employee.Name, employee.LastName, employee.Address, employee.GrossSalary, employee.NetSalary }).ToList(); StringBuilder sb = new StringBuilder(); // 构建HTML表格框架 sb.Append("<table border='1' cellpadding='5' cellspacing='0' style='border: 1px solid #ccc;font-family: Arial; font-size: 10pt;'>"); // 构建表头(移除重复列) sb.Append("<tr>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Id</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Name</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>LastName</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Address</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>NetSalary</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>GrossSalary</th>"); sb.Append("</tr>"); // 构建数据行 query.ForEach(employee => { sb.Append("<tr>"); foreach (var propertyInfo in employee.GetType().GetProperties()) { sb.Append("<td style='border: 1px solid #ccc'>"); sb.Append(propertyInfo.GetValue(employee)); sb.Append("</td>"); } sb.Append("</tr>"); }); sb.Append("</table>"); // 使用UTF-8编码避免乱码 using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(sb.ToString()))) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(byteArrayOutputStream); PdfDocument pdfDocument = new PdfDocument(writer); pdfDocument.SetDefaultPageSize(PageSize.A4); HtmlConverter.ConvertToPdf(stream, pdfDocument); pdfDocument.Close(); return File(byteArrayOutputStream.ToArray(), "application/pdf", "EmployeeList.pdf"); } } }
关键修改说明
- 数据源修正:直接从
Context.EmployeeCategories读取数据,移除多余的AsQueryable()转换(List无需再转为IQueryable)。 - 表头清理:删除重复的列定义,确保表头列数与匿名类属性数量一致。
- 编码优化:将
Encoding.ASCII替换为Encoding.UTF8,解决非ASCII字符乱码问题。
内容的提问来源于stack exchange,提问作者Unity_cube
相关产品推荐
相关产品推荐

