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