Генерация файла Excel с использованием LoadFromCollection из объекта JSON - PullRequest
1 голос
/ 04 октября 2019

Мне нужно создать лист Excel из объекта JSON. Мой объект JSON неизвестен и может отличаться от вызова к вызову. Он имеет простую структуру (одни и те же поля в нескольких строках).

Я хочу использовать следующий код.

workSheet.Cells[2, 1].LoadFromCollection(dataList, false);

dataList вход является списком (динамическим)

Поскольку мой JSON неизвестен, я не могу определить класс для этого списка (имена и типы параметров)

У меня вопрос Как динамически преобразовать объект JSON в List?

например, у меня есть объект json с 3 строками для экспорта:

dataJson -> [{"FirstName":"Yaniv","LastName":"Test","Age": 30,"SubmitDate":"2019-10-04"},{....},{....}]   

Мне нужно, чтобы он был списком dataList -> Count 3

first Item:

Age 30
FirstName "Yaniv"
LastName "Test"
SubmitDate [2019-10-04]

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Если вы используете Newtonsoft.Json, вы можете десериализовать его в динамическую структуру:

var dyn = JArray.Parse("{jsonhere...}");

Затем вы можете прочитать такие свойства:

const string json =
"[{\"prop\": 1, \"test\": \"test!\"}, {\"prop\": 2, \"test\": \"test again!\"}, {\"prop\": 3, \"test\": \"one more!\"}]";

var parsed = JArray.Parse(json);

foreach (var value in parsed)
{
     var prop = value.Value<int>("prop");
     var test = value.Value<string>("test");

     Console.WriteLine($"Prop: [{prop}] | Test: [{test}]");
}

Результат будет:

Prop: [1] | Test: [test!]
Prop: [2] | Test: [test again!]
Prop: [3] | Test: [one more!]
0 голосов
/ 06 октября 2019

Создание Excel из ввода JSON LoadFromCollection было плохой идеей.

Самое простое и простое решение - LoadFromDataTable путем преобразования JSON в DataTable :

  1. DataTable data = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(dataJson);

  2. workSheet.Cells[1, 1].LoadFromDataTable(data,true);

Просто так ?

0 голосов
/ 04 октября 2019

Вы можете десериализовать свой JSON в List<Dictionary<string, object>>. Например:

var json = "[{\"FirstName\":\"Yaniv\",\"LastName\":\"Test\",\"Age\": ......]"; 
var data = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);

Теперь вы можете извлечь некоторые детали из этого списка. Таким образом, чтобы получить имена столбцов:

var columnNames = data.First().Keys.ToList();

И обведите ваши данные вот так. Это будет в основном выводить в формате CSV, но этого должно быть достаточно для изменения в соответствии с вашими потребностями:

// Write out the column headers
foreach (var columnName in columnNames)
{
    Console.Write(columnName + ",");
}
Console.WriteLine();

// Write out each element
foreach (var item in data)
{
    foreach (var columnName in columnNames)
    {
        Console.Write(item[columnName] + ",");
    }

    Console.WriteLine();
}

Это даст вывод примерно так:

FirstName,LastName,Age,SubmitDate,
Yaniv,Test,30,2019-10-04,
Yaniv,Test,30,2019-10-04,
Yaniv,Test,30,2019-10-04,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...