Страницы: 1
RSS
Из excell табличного вида в json структуру
 
Добрый день, имеется выгрузка в excell в табличном виде, нужно данные сохранить в json структуре, через формулу "=" практически получил нужную структуру но не могу последнюю проблему решить как объяснить макросу, что если работа входит в фазу (суммарную работу), то нужно добавить в конце " ]} " и добавить столько в зависимости от уровня раз. (надеюсь последнее предложение более или менее понятно объяснил)).
в примере на вкладке "пример" есть исходные данные, и итоговый формат который получилось достичь через "=" , в M26,N26,O26 те самые формулы в зависимости от типа столбец L подставляется та или иная формула, но в примечании столбец P указал, что не получается сделать.
во вкладке json столбец A это то что получилось а в столбце C то что руками исправил, и что автоматом бы получить, (выделил жирным)
Может подскажете макрос или еще какой нибудь метод решения данной проблемы?
 
Здравствуйте.опубликуйте результирующий json, на пару строк с таблицы.
Возможно помогу макросом.
 
Добрый день, вот пример файла на всю таблицу
 
В макросе изложен принцип формирования JSON.
Если у вас офис 64 битный, скину другой вариант, есть особенности.
 
Добрый день, если я правильно понял, то в макросе test, Вы вручную всю структуру завели? тогда не очень понятен принцип формирования json структуры... или я не туда смотрю...может укажете куда смотреть?
 
Во вложении Ваш отформатированный json ,структуру  в макросе создал согласно файла руками.
В макросе показан принцип формирования.труда не должно составить для написания реального макроса.
children -это массив, остальное объект.
Изменено: Doober - 13.03.2017 12:04:48
 
 я увидел что формируется, но проблема в другом получается если у меня будет 300 строк мне всю структуру необходимо будет в макрос писать? и так под каждую новую структуру?
нашел макрос

Код
Public Sub exceltojson()
Dim rng As Range, items As New Collection, myitem As New Dictionary, i As Integer, cell As Variant
set rng = Range("A2:A3")
'Set rng = Range(Sheets(2).Range("A2"), Sheets(2).Range("A2").End(xlDown)) use this for dynamic range
i = 0
For Each cell In rng
Debug.Print (cell.Value)
myitem("name") = cell.Value
myitem("email") = cell.Offset(0, 1).Value
myitem("phone") = cell.Offset(0, 2).Value
items.Add myitem
Set myitem = Nothing
i = i + 1
Next
Sheets(1).Range("A4").Value = ConvertToJson(items, Whitespace:=2)
End Sub

ниже библиотека для подключения JsonConverter.zip (8.01 КБ)
но выходит ошибка на myitem As New Dictionary
, в принципе макрос годный но как children структуру создавать проблема.
Изменено: Сергей Шистеров - 16.03.2017 07:16:02
 
Сергей Шистеров, спасибо за наводку, интересная библиотека, надо ее поковырять, уж очень она навернутая.
По
Цитата
Сергей Шистеров написал:
на myitem As New Dictionary
https://github.com/VBA-tools/VBA-JSON#installation
добавьте в редакторе VBA референс на "Microsoft Scripting Runtime"

Но в вашем случае проблема не в конвертации строки в json, а в объяснении любому конвертеру, что в этом месте заканчивается объект или массив (или несколько объектов/массивов). Начинал возиться да потом отвлекли, бросил.
F1 творит чудеса
 
Вот полностью рабочий вариант , этой библиотеки с примерами, но Children так мне и не победить(
https://cloud.mail.ru/public/KBCQ/24FFyvYFh
размер 150 кб не влазит на форум даже в архиве
Изменено: Сергей Шистеров - 16.03.2017 13:02:03
 

вот другой пример, где добавляется Location мне бы вместо него, типа проверки если фаза то children :[

Код
Public Sub exceltonestedjson()
Dim rng As Range, items As New Collection, myitem As New Dictionary, subitem As New Dictionary, i As Integer, cell As Variant
Set rng = Range("A2:A3")
'Set rng = Range(Sheets(2).Range("A2"), Sheets(2).Range("A2").End(xlDown)) use this for dynamic range
i = 0
For Each cell In rng
Debug.Print (cell.Value)
myitem("name") = cell.Value
myitem("email") = cell.Offset(0, 1).Value
myitem("phone") = cell.Offset(0, 2).Value
subitem("country") = cell.Offset(0, 3).Value
myitem.Add "location", subitem
items.Add myitem
Set myitem = Nothing
Set subitem = Nothing
i = i + 1
Next
Sheets(2).Range("A4").Value = ConvertToJson(items, Whitespace:=2)
End Sub

Изменено: Сергей Шистеров - 16.03.2017 13:01:03
 
Код
Sub customJSON_3()
Dim mainContainer As New Collection, tempContainer As New Dictionary, children As New Collection
tempContainer.Add "name", Range("B3").Value
tempContainer.Add "dateStart", Range("C3").Value
children.Add tempContainer
Set tempContainer = Nothing
tempContainer.Add "name", Range("B2").Value
tempContainer.Add "dateStart", Range("C2").Value
tempContainer.Add "children", children
mainContainer.Add tempContainer
Sheets(1).Range("H10").Value = ConvertToJson(mainContainer, Whitespace = 2)
End Sub
результат его работы
Код
[
{
"name": "Work",
"dateStart": "2017-05-04",
"children": [
{
"name": "Next",
"dateStart": "2017-05-04"
}
]
}
]
Подскажите как его адаптировать под мою задачу?
чтобы либо по WBS структуру создавал либо если в ячейке указано "НЕТ" то все что ниже, до следующего "НЕТ" заводил под children
 
Не стал пока колбаситься с макросом, сделал формулами.
Разбил на три части для облегчения понимания:
1. Фикс.часть
2. Завершение "Фаза или Работа"
3. Закрытие объекта или списка

Проверьте
F1 творит чудеса
 
Да спасибо, все работает!
Страницы: 1
Читают тему
Наверх