【问题标题】:c# .NET LINQ Query and returning a count for Excel to Jsonc# .NET LINQ 查询并将 Excel 的计数返回到 Json
【发布时间】:2017-05-18 09:21:30
【问题描述】:

我目前使用ClosedXml 打开一个 Excel 文件,我想将行/单元格转换成一个 json 字符串,看起来像这样(或这种格式):

{"listOfRows":
  [
    {"column0":"test", "column1":"test1", "column2":"test1", },
    {"column0":"test", "column1":"test1"}
  ],
"rowNumber":1}

列号需要增加,这就是我苦苦挣扎的地方。我目前有以下 linq 查询:

var test = from row in workSheet.Rows()
           select new
           {
               listOfRows = from cell in row.Cells()
                            select new
                            {
                                column = cell.Value,
                            },
               rowNumber = row.RowNumber()
            };

您将解决的问题不会增加我的专栏。有人可以帮忙解决一下卷发吗?

【问题讨论】:

  • 您的 json 必须有多准确?如果一行中的每一列都是以列索引和值作为属性的对象本身,是否可以?

标签: c# json excel linq


【解决方案1】:

这更像你的预期吗?

Linqs .Select() 方法也支持索引器:

var test = workSheet.Rows().Select((row, i) =>
   new
   {
      listOfRows = row.Cells().Select((cell, j) => {
          var obj = new ExpandoObject() as IDictionary<string, Object>;
          obj.Add($"column{j}", cell.Value);

          return obj;
      }),
      rowNumber = i
   });

现在到 expando 对象(让我解释一下):

它只能通过 DLR(动态语言运行时)使用,并允许您在运行时添加属性。

大多数内部代码的第一次迭代大约等于:

dynamic obj = new ExpandoObject();
obj.column0 = cell.Value;

return obj;

但是,您无法使用索引器控制属性名称,因此在我的答案中使用 obj.Add($"column{j}", cell.Value); 语法。

为了完整起见,here 是 MSDN 链接。

【讨论】:

  • 似乎更近了。理论上它会起作用。但它不编译?很近!!!谢谢你的帮助。非常感谢
  • 它是一个括号,所以是的......它现在编译了吗?
  • 不,很遗憾没有。是不是因为select没有对象?
  • @user1112324 你能再试一次吗?
【解决方案2】:

我会先写一个扩展方法来解决这个问题...

public static dynamic ToObject(this IDictionary<string, object> source)
{
    dynamic result = new ExpandoObject();
    source.ForEach(i => result[i.Key] = i.Value);
    return result;
}

如果您随后将每一行构建到一个字典中,那么 ToObject() 每个字典在最终测试对象上进行简单的 json 转换就足够了...

var test = new { 
   listOfRows =  workSheet.Rows()
     .Select(r => {
        var row = r.Cells().Select((c,i) => new { Key = $"Column{i}", Value = c.Value })
           .ToDictionary(x => x.Key, x => x.Value)
           .ToObject();
        row.rowNumber = r.RowNumber();
        return row;
   };

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2022-08-09
    相关资源
    最近更新 更多