C# 使用C将excel转换为JSON,excel中的第一行作为键
我希望通过指定图纸名称从excel 2010中读取数据。然后我想把数据转换成JSON格式。假设我有一张这样的excel表格C# 使用C将excel转换为JSON,excel中的第一行作为键,c#,.net,json,excel,vba,C#,.net,Json,Excel,Vba,我希望通过指定图纸名称从excel 2010中读取数据。然后我想把数据转换成JSON格式。假设我有一张这样的excel表格 Name | Age | Country Waugh, Timothy 10 UK Freeman, Neil 20 USA Andy, Robert 30 Poland 应导致: [{"Name":"Waugh, Timothy","Age":
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;
}
}
问题:
我必须硬编码列名称。列名不是动态的。
使用此代码,我无法读取理想情况下用作列名的第一行
你会在下面找到列名吗
rdr.GetName(0); //First column name
rdr.GetName(1); //Second column name
rdr.GetName(2); //Third column name
然后你需要把它放在一个排序的动态对象中。无法在运行时生成匿名对象
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;
}
}
你会在下面找到列名吗
rdr.GetName(0); //First column name
rdr.GetName(1); //Second column name
rdr.GetName(2); //Third column name
然后你需要把它放在一个排序的动态对象中。无法在运行时生成匿名对象
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;
}
}
为了使fhogberg的答案适用于动态列数,只需进行以下修改:
var query =
(from DbDataRecord row in rdr
select row).Select(x =>
{
//dynamic item = new ExpandoObject();
Dictionary<string, object> item = new Dictionary<string, object>();
for (int i=0; i < x.FieldCount; i++)
item.Add(rdr.GetName(i), x[i]);
return item;
});
为了使fhogberg的答案适用于动态列数,只需进行以下修改:
var query =
(from DbDataRecord row in rdr
select row).Select(x =>
{
//dynamic item = new ExpandoObject();
Dictionary<string, object> item = new Dictionary<string, object>();
for (int i=0; i < x.FieldCount; i++)
item.Add(rdr.GetName(i), x[i]);
return item;
});
你试过先把它读入数据表吗?请参阅。另请参阅中的第一个转换器。刚刚选中-中的DataReaderConverter生成您想要的JSON,而不使用硬编码列名。您是否尝试过先将其读入DataTable?请参阅。另请参阅。中的第一个转换器。刚刚选中-中的DataReaderConverter生成您想要的JSON,而不使用硬编码的列名。如何使用动态列数进行转换?如何使用动态列数进行转换?