服务器之家

服务器之家 > 正文

C#实现Json转DataTable并导出Excel的方法示例

时间:2022-03-09 13:37     来源/作者:东边的小山

本文实例讲述了C#实现Json转DataTable并导出Excel的方法。分享给大家供大家参考,具体如下:

需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串

思路是,把Json字符串转换成DataTable,然后导出到Excel

在网上找了一些资料,整理了以下三种类型的Json

一、Json转换DataTable

1.处理简单Json:

[{"mac":"20:f1:7c:c5:cd:80","rssi":"-86","ch":"9"},{"mac":"20:f1:7c:c5:cd:85","rssi":"-91","ch":"9"}]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/// <summary>
/// Json 字符串 转换为 DataTable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static DataTable ToDataTableTwo(string json)
{
  DataTable dataTable = new DataTable(); //实例化
  DataTable result;
  try
  {
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
    ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
    if (arrayList.Count > 0)
    {
      foreach (Dictionary<string, object> dictionary in arrayList)
      {
        if (dictionary.Keys.Count<string>() == 0)
        {
          result = dataTable;
          return result;
        }
        //Columns
        if (dataTable.Columns.Count == 0)
        {
          foreach (string current in dictionary.Keys)
          {
            dataTable.Columns.Add(current, dictionary[current].GetType());
          }
        }
        //Rows
        DataRow dataRow = dataTable.NewRow();
        foreach (string current in dictionary.Keys)
        {
          dataRow[current] = dictionary[current];
        }
        dataTable.Rows.Add(dataRow); //循环添加行到DataTable中
      }
    }
  }
  catch
  {
  }
  result = dataTable;
  return result;
}

2.处理复杂Json

[{"id":"00e58d51","data":[{"mac":"20:f1:7c:c5:cd:80","rssi":"-86","ch":"9"},{"mac":"20:f1:7c:c5:cd:85","rssi":"-91","ch":"9"}]},
{"id":"00e58d53","data":[{"mac":"bc:d1:77:8e:26:78","rssi":"-94","ch":"11"},{"mac":"14:d1:1f:3e:bb:ac","rssi":"-76","ch":"11"},{"mac":"20:f1:7c:d4:05:41","rssi":"-86","ch":"12"}]}]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/// <summary>
/// Json 字符串 转换为 DataTable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static DataTable ToDataTable(string json)
{
  DataTable dataTable = new DataTable(); //实例化
  DataTable result;
  try
  {
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
    ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
    if (arrayList.Count > 0)
    {
      foreach (Dictionary<string, object> dictionary in arrayList)
      {
        if (dictionary.Keys.Count<string>() == 0)
        {
          result = dataTable;
          return result;
        }
        //Columns
        if (dataTable.Columns.Count == 0)
        {
          foreach (string current in dictionary.Keys)
          {
            if (current != "data")
              dataTable.Columns.Add(current, dictionary[current].GetType());
            else
            {
              ArrayList list = dictionary[current] as ArrayList;
              foreach (Dictionary<string, object> dic in list)
              {
                foreach (string key in dic.Keys)
                {
                  dataTable.Columns.Add(key, dic[key].GetType());
                }
                break;
              }
            }
          }
        }
        //Rows
        string root = "";
        foreach (string current in dictionary.Keys)
        {
          if (current != "data")
            root = current;
          else
          {
            ArrayList list = dictionary[current] as ArrayList;
            foreach (Dictionary<string, object> dic in list)
            {
              DataRow dataRow = dataTable.NewRow();
              dataRow[root] = dictionary[root];
              foreach (string key in dic.Keys)
              {
                dataRow[key] = dic[key];
              }
              dataTable.Rows.Add(dataRow);
            }
          }
        }
      }
    }
  }
  catch
  {
  }
  result = dataTable;
  return result;
}

3.处理不规则Json,因为列并不确定,所以直接定义列,不动态生成

[{"id":"00e58d53","data":[{"mac":"34:b3:54:89:86:64","rssi":"-86","ch":"13"},{"mac":"50:bd:5f:02:80:44","rssi":"-90","ch":"1"}]},
{"id":"00ccda81","data":[{"mac":"bc:46:99:4e:96:c8","rssi":"-92","ch":"1"},{"mac":"bc:3a:ea:fc:77:6c","rssi":"-93","ch":"6","ds":"Y","essid":"vienna hotel WIFI"}]}]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/// <summary>
/// Json 字符串 转换为 DataTable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static DataTable ToDataTable(string json)
{
  DataTable dataTable = new DataTable(); //实例化
  DataTable result;
  try
  {
    dataTable.Columns.Add("id");
    dataTable.Columns.Add("mac");
    dataTable.Columns.Add("rssi");
    dataTable.Columns.Add("ch");
    dataTable.Columns.Add("ts");
    dataTable.Columns.Add("tmc");
    dataTable.Columns.Add("tc");
    dataTable.Columns.Add("ds");
    dataTable.Columns.Add("essid");
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
    ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
    if (arrayList.Count > 0)
    {
      foreach (Dictionary<string, object> dictionary in arrayList)
      {
        if (dictionary.Keys.Count<string>() == 0)
        {
          result = dataTable;
          return result;
        }//Rows
        string root = "";
        foreach (string current in dictionary.Keys)
        {
          if (current != "data")
            root = current;
          else
          {
            ArrayList list = dictionary[current] as ArrayList;
            foreach (Dictionary<string, object> dic in list)
            {
              DataRow dataRow = dataTable.NewRow();
              dataRow[root] = dictionary[root];
              foreach (string key in dic.Keys)
              {
                dataRow[key] = dic[key];
              }
              dataTable.Rows.Add(dataRow);
            }
          }
        }
      }
    }
  }
  catch
  {
  }
  result = dataTable;
  return result;
}

二、导出Excel

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="table"></param>
/// <param name="file"></param>
public void dataTableToCsv(DataTable table, string file)
{
  string title = "";
  FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
  StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default);
  for (int i = 0; i < table.Columns.Count; i++)
  {
    title += table.Columns[i].ColumnName + "\t"; //栏位:自动跳到下一单元格
  }
  title = title.Substring(0, title.Length - 1) + "\n";
  sw.Write(title);
  foreach (DataRow row in table.Rows)
  {
    string line = "";
    for (int i = 0; i < table.Columns.Count; i++)
    {
      line += row[i].ToString().Trim() + "\t"; //内容:自动跳到下一单元格
    }
    line = line.Substring(0, line.Length - 1) + "\n";
    sw.Write(line);
  }
  sw.Close();
  fs.Close();
}

三、调用实现,数据导出到Excel

?
1
2
3
4
5
6
protected void Button1_Click(object sender, EventArgs e)
{
  string str = File.ReadAllText(@"C:\Users\Admin\Desktop\json.txt");
  DataTable dt = ToDataTable(str);
  this.dataTableToCsv(dt, @"E:\json.xls"); //调用函数
}

希望本文所述对大家C#程序设计有所帮助。

原文链接:https://blog.csdn.net/yelin042/article/details/86551041

标签:

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部