【问题标题】:'Parameter count mismatch' Error when trying to insert List<dynamic> to Excel using closedXml InsertData\'Parameter count mismatch\' 尝试使用 closedXml InsertData 将 List<dynamic> 插入 Excel 时出错
【发布时间】:2022-11-03 23:12:09
【问题描述】:

我正在尝试使用 ClosedXML 将动态列表项导出到 Excel。目标是允许最终用户选择要导出的列。由于列是动态的,我使用 System.Linq.Dynamic.Core 命名空间的.ToDynamicListAsync()。 问题是,如果我创建匿名对象,excel 导出工作正常,但当我直接传递选择查询时抛出错误,如下所示。我直接通过 select cols bcoz cols 只会在运行时知道。

为了清楚起见,下面是代码快照

            using ClosedXML.Excel;
            using System.Linq.Dynamic.Core;

            var filter = "MeetingNo = 85";
            var query = context.PrmProjects.AsNoTracking().Where(filter);

            var items = await query.Select(x => new
            {
                x.OrganizationId,
                x.ProjectNo,
                x.MeetingNo,
                x.Name
            }).ToDynamicListAsync();
            using var wb = new XLWorkbook();
            var ws = wb.Worksheets.Add();
            ws.Cell(3, 1).InsertData(items); /// WORKS FINE


            var selectQuery = $"new(OrganizationId,ProjectNo,MeetingNo,Name)";
            var items1 = await query.Select(selectQuery).ToDynamicListAsync();
            using var wb2 = new XLWorkbook();
            var ws2 = wb2.Worksheets.Add();
            ws2.Cell(3, 1).InsertData(items1); /// THROW ERROR 'Parameter count mismatch' 

`

在上面的示例代码中,带有列表 'items' 的 InsertData 工作正常,但 'items1' 抛出错误 'Parameter count mismatch'

列表“项目”的屏幕截图,工作正常

列表“items1”的屏幕截图,抛出错误:

错误截图:

谁能帮帮我吗。我究竟做错了什么。

【问题讨论】:

  • 难道是因为MeetingNo 可以为空?
  • 它不为空。

标签: excel export .net-6.0 closedxml dynamic-linq


【解决方案1】:

这个错误的原因是 System.Linq.Dynamic.Core 基于DynamicClass 创建了一个新的动态类型,它也有一个索引器:

public object? this[string name]
{
    get
    {
        //
    }

    set
    {
        //
    }
}

ClosedXml 在ObjectReader.cs 类中调用GetProperties(...),而这个GetProperties 确实返回5 个条目:

  • 组织 ID
  • 项目编号
  • 会议号
  • 名称
  • 指数--> 这是在 DynamicClass 上定义的索引器,它不是一个真正的普通属性。

所以实际上 ClosedXML 应该是 fixed 以排除索引器方法。 例子:

int parameters = propertyInfo.GetIndexParameters().Length;
if (parameters > 0)
{
    // The property is an indexer, skip this.
    continue;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多