c#.NET LINQ查询并返回一个计数到Json的Excel

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

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

正如你将解决不会增加我的专栏。 任何人都可以帮助curl的?

这是更像你预期吗?

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语言运行库)使用,并允许您在运行时添加属性。

第一次迭代大部分内部代码约等于:

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

然而,那么你不能控制索引器的属性名称,因此使用obj.Add($"column{j}", cell.Value); 语法在我的答案。

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

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

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

如果你然后build立每一行字典,然后ToObject()每个字典一个简单的JSON转换最后的testing对象应该足够了… … –

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