You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
        }
    }
}

关键修改说明

  1. 数据源修正:直接从Context.EmployeeCategories读取数据,移除多余的AsQueryable()转换(List无需再转为IQueryable)。
  2. 表头清理:删除重复的列定义,确保表头列数与匿名类属性数量一致。
  3. 编码优化:将Encoding.ASCII替换为Encoding.UTF8,解决非ASCII字符乱码问题。

内容的提问来源于stack exchange,提问作者Unity_cube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:50:22