C# 使用C将excel转换为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":

我希望通过指定图纸名称从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;
                }
            }
问题:

我必须硬编码列名称。列名不是动态的。 使用此代码,我无法读取理想情况下用作列名的第一行
你会在下面找到列名吗

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,而不使用硬编码的列名。如何使用动态列数进行转换?如何使用动态列数进行转换?