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

问题:

  1. 我必须硬编码的列名称。 列名不是dynamic的。
  2. 有了这个代码,我无法读取第一行(应该理想地作为列名)

想想你会在下面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; } }