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

ASP.NET MVC Core中ExportToPDF方法实现错误求助

解决ASP.NET MVC Core ExportToPDF中的类型转换错误

错误原因分析

  • 第一个错误:你在LINQ查询中返回了混合类型的数组,却强制转换为List<EmployeeCategory>,数组与实体类类型完全不兼容,导致无法转换。
  • 第二个错误:new[] {employee.Id, employee.Name, ...}里同时包含int、string、double多种类型,C#无法自动推断出这个隐式数组的统一类型。

方案一:直接使用EmployeeCategory实体列表(推荐)

不需要将实体转成数组,直接查询获取实体列表,在构建HTML时逐个将属性转为字符串即可,代码更易读且保留类型处理灵活性:

修改ExportToPDF方法的数据获取和循环部分:

[HttpPost]
public FileResult ExportToPDF()
{
    // 直接获取EmployeeCategory实体列表
    List<EmployeeCategory> employees = Context.EmployeeCategories.Take(6).ToList();

    StringBuilder sb = new StringBuilder();
    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>");

    // 遍历实体,逐个处理属性
    foreach (var employee in employees)
    {
        sb.Append("<tr>");
        // 处理可空字符串避免显示null,格式化数值提升可读性
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.Id}</td>");
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.Name ?? string.Empty}</td>");
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.LastName ?? string.Empty}</td>");
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.Address ?? string.Empty}</td>");
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.NetSalary.ToString("N2")}</td>");
        sb.Append($"<td style='border: 1px solid #ccc'>{employee.GrossSalary.ToString("N2")}</td>");
        sb.Append("</tr>");
    }

    sb.Append("</table>");

    // PDF生成部分保持不变
    using (MemoryStream stream = new MemoryStream(Encoding.ASCII.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");
    }
}

方案二:统一转为string数组列表

如果坚持使用数组方式,需要在查询时明确将所有属性转为string,确保数组类型统一:

修改数据获取部分:

List<string[]> employees = (from employee in Context.EmployeeCategories.Take(6)
                            select new string[] {
                                employee.Id.ToString(),
                                employee.Name ?? string.Empty,
                                employee.LastName ?? string.Empty,
                                employee.Address ?? string.Empty,
                                employee.NetSalary.ToString(),
                                employee.GrossSalary.ToString()
                            }).ToList();

后续的循环部分可以保持原代码不变,此时employees是List<string[]>类型,不会再出现类型转换错误。


内容的提问来源于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 15:05:23