将Excel中的第一行用作键,将Excel转换成JSON
我正在寻找通过指定工作表名称从excel 2010
读取数据。 然后我想将数据转换成JSON格式。 假设我有一个这样的Excel表。
Name | Age | Country Waugh, Timothy 10 UK Freeman, Neil 20 USA Andy, Robert 30 Poland
应该导致:
[{"Name":"Waugh, Timothy","Age":10.0,"Country":"UK"}, {"Name":"Freeman, Neil","Age":20.0,"Country":"USA"}, {"Name":"Andy, Robert","Age":30.0,"Country":"Poland"}]
到目前为止,我正在使用这个代码:
var pathToExcel = @"C:\temp\file.xlsx"; var sheetName = "sheetOne"; //This connection string works if you have Office 2007+ installed and your //data is saved in a .xlsx file var connectionString = String.Format(@" Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0}; Extended Properties=""Excel 12.0 Xml;HDR=YES"" ", pathToExcel); //Creating and opening a data connection to the Excel sheet using (var conn = new OleDbConnection(connectionString)) { conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = String.Format( @"SELECT * FROM [{0}$]", sheetName ); using (var rdr = cmd.ExecuteReader()) { //LINQ query - when executed will create anonymous objects for each row var query = from DbDataRecord row in rdr select new { Name = row[0], Age = row[1], Country = row[2] }; //Generates JSON from the LINQ query var json = JsonConvert.SerializeObject(query); return json; } }
问题:
- 我必须硬编码的列名称。 列名不是dynamic的。
- 有了这个代码,我无法读取第一行(应该理想地作为列名)
想想你会在下面find列名
rdr.GetName(0); //First column name rdr.GetName(1); //Second column name rdr.GetName(2); //Third column name
那么你需要把它放在一个dynamic的对象中。 运行时不能生成匿名对象。
var list = rdr.Select(x => { dynamic itm = new ExpandoObject(); itm.Add(rdr.GetName(0), x[0]; itm.Add(rdr.GetName(1), x[1]; itm.Add(rdr.GetName(2), x[2]; return itm; }).ToList();
认为你将能够从那里拿走它。
添加完整的示例
var pathToExcel = @"C:\temp\file.xlsx"; var sheetName = "sheetOne"; //This connection string works if you have Office 2007+ installed and your //data is saved in a .xlsx file var connectionString = String.Format(@" Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0}; Extended Properties=""Excel 12.0 Xml;HDR=YES"" ", pathToExcel); //Creating and opening a data connection to the Excel sheet using (var conn = new OleDbConnection(connectionString)) { conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = String.Format( @"SELECT * FROM [{0}$]", sheetName ); using (var rdr = cmd.ExecuteReader()) { //LINQ query - when executed will create anonymous objects for each row var query = (from DbDataRecord row in rdr select row).Select(x => { //dynamic item = new ExpandoObject(); Dictionary<string,object> item = new Dictionary<string, object>(); item.Add(rdr.GetName(0), x[0]); item.Add(rdr.GetName(1), x[1]); item.Add(rdr.GetName(2), x[2]); return item; }); //Generates JSON from the LINQ query var json = JsonConvert.SerializeObject(query); return json; } }