Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
20.04.2024, 06:44:01

Войти
Добавляйтесь в нашу группу ВКонтакте - будьте в курсе всех новых событий сайта, узнавайте первым обо всех акциях и новых статьях!
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  выборка данных из кучи xml файлов в таблицу excel
Страниц: 1 [2] 3 4  Все   Вниз
Печать
Автор Тема: выборка данных из кучи xml файлов в таблицу excel  (Прочитано 16870 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #15 : 23.07.2021, 12:07:36 »

Вот так работает без проблем:
Точно. Я пробовал так только без ESADout_ прописывал. Попозже проверю.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #16 : 23.07.2021, 13:32:45 »

Если в ESADout_CUGoodsShipment есть 2 или более вложений ESADout_CUGoods в которых catESAD_cu:GoodsNumeric и catESAD_cu:GoodsTNVEDCode разные, хотя последнее может быть и одинаковым. Из таких файлов xml тянет только первую запись остальные пропускает. Как сделать чтоб брало все. Пример xml могу закинуть позже.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #17 : 23.07.2021, 14:31:13 »

вот пример кода с двумя областями содержащими выше указанные подобласти. Как прокрутить все подобласти?
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #18 : 26.07.2021, 04:53:16 »

вот корректный xml файл
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #19 : 26.07.2021, 06:02:42 »

ESADout содержит item7 (ESADout_CUGoodsShipment), который в свою очередь содержит item15 и item16 (ESADout_CUGoods), которые включают item1 (catESAD_cu:GoodsNumeric) и item7 (catESAD_cu:GoodsTNVEDCode). ESADout_CUGoods может быть хоть 100 штук и они содержат разные catESAD_cu:GoodsNumeric и catESAD_cu:GoodsTNVEDCode. Как дописать код чтобы значения из всех catESAD_cu:GoodsNumeric и catESAD_cu:GoodsTNVEDCode построчно добавились.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #20 : 26.07.2021, 11:52:14 »

Как я понимаю нужно перед записью в 4 столбец добавить условие если таких записей больше 1 (есть отдельный нод в котором записывается сколько таких вложений) то надо пройтись по всем вложениям, а потом уже перейти к обработке следующего файла, а если равен 1 то заполнить столбцы и идти к следующему файлу. Возник вопрос как правильно прописать условие такой то нод > 1.  И можно ли в уже открытой функции если писать ещё одну если. И можно ли обращаться к item
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #21 : 26.07.2021, 15:27:22 »

Разбор таможенных деклараций не самая интересная задача. Но муторная. И текущий вопрос явно не будет последним. Я с такими файлами уже работал и могу сказать одно: для начала надо всю задачу для себя сформулировать и разложить на алгоритмы.
В общем и целом, Вам надо делать что-то вроде цикла сразу по всем ESADout_CUGoods в схеме, а потом дергать оттуда информацию
Код: (vb)
Set nESADout_CUGoods = xmlDoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods")
For Each nCUGoods In nESADout_CUGoods
sGoodsNumeric = nCUGoods.SelectSingleNode("catESAD_cu:GoodsNumeric").nodetypedvalue
sGoodsTNVEDCode = nCUGoods.SelectSingleNode("catESAD_cu:GoodsTNVEDCode").nodetypedvalue
Next
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #22 : 27.07.2021, 00:42:19 »

Разбор таможенных деклараций не самая интересная задача. Но муторная. И текущий вопрос явно не будет последним. Я с такими файлами уже работал и могу сказать одно: для начала надо всю задачу для себя сформулировать и разложить на алгоритмы.
В общем и целом, Вам надо делать что-то вроде цикла сразу по всем ESADout_CUGoods в схеме, а потом дергать оттуда информацию
На сегодняшний день задача простая выбрать информацию о номерах ДТ, направлении перемещения, процедуру, номера товаров, код ТНВЭД. Просто до этого с xml не работал. С dbf файлами работал, но там все просто через access вытягивал все что угодно. Вот и хочу понять принципы работы с xml, мне главное в excel стянуть все правильно, а дальше я уже другими методами обработаю. Примеров в сети по работе с  xml ДТ нет и это плохо, так бы может и вопросов было меньше. Спасибо Вам, что направляете на путь истинный
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #23 : 27.07.2021, 09:05:51 »

в общем доработал код и получилось следующее
Код: (vb)
Private Sub CommandButtonImport_Click()

Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
            .Filters.clear
            .Title = "Select Multiple XML Files"
            .Filters.Add "XML File", "*.xml", 1
            .AllowMultiSelect = True
                       
        If .Show = True Then
            Dim xdoc As Object
            Set xdoc = CreateObject("MSXML2.DOMdocument")
            xdoc.async = False: xdoc.validateOnParse = False
            row_number = 1
            For i = 1 To .SelectedItems.Count
                xmlFileName = fd.SelectedItems(i)
                xdoc.Load (xmlFileName)
                Set xdocE = xdoc.DocumentElement
                For Each xdocE In xdoc.SelectNodes("ED_Container/ContainerDoc/DocBody/ESADout_CU")
               
                Application.Range("DTRange").Cells(row_number, 1).Value = Right(xdocE.SelectSingleNode("/comment()").Text, 23)
                Application.Range("DTRange").Cells(row_number, 2).Value = xdocE.SelectSingleNode("CustomsProcedure").Text
                Application.Range("DTRange").Cells(row_number, 3).Value = xdocE.SelectSingleNode("CustomsModeCode").Text
               
                Set nESADout_CUGoodsShipment = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment")
                For Each nCUGoodsShipment In nESADout_CUGoodsShipment
                sTotalGoodsNumber = nCUGoodsShipment.SelectSingleNode("catESAD_cu:TotalGoodsNumber").nodeTypedValue
                Next
               
                Set nESADout_CUGoods = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods")
                For Each nCUGoods In nESADout_CUGoods
                sGoodsNumeric = nCUGoods.SelectSingleNode("catESAD_cu:GoodsNumeric").nodeTypedValue
                sGoodsTNVEDCode = nCUGoods.SelectSingleNode("catESAD_cu:GoodsTNVEDCode").nodeTypedValue
                sGoodsMarking = nCUGoods.SelectSingleNode("catESAD_cu:GoodsGroupDescription/catESAD_cu:GoodsGroupInformation/catESAD_cu:GoodsMarking").nodeTypedValue
               
                Application.Range("DTRange").Cells(row_number, 4).Value = sGoodsNumeric
                Application.Range("DTRange").Cells(row_number, 5).Value = sGoodsTNVEDCode
                Application.Range("DTRange").Cells(row_number, 6).Value = sGoodsMarking
                row_number = row_number + 1
               
                If sTotalGoodsNumber > 1 Then GoTo a1 Else GoTo a2
                   
               
a1:             If Application.Range("DTRange").Cells(row_number, 1).Value = "" Then Application.Range("DTRange").Cells(row_number, 1).Value = Application.Range("DTRange").Cells(row_number - 1, 1).Value
                If Application.Range("DTRange").Cells(row_number, 2).Value = "" Then Application.Range("DTRange").Cells(row_number, 2).Value = Application.Range("DTRange").Cells(row_number - 1, 2).Value
                If Application.Range("DTRange").Cells(row_number, 3).Value = "" Then Application.Range("DTRange").Cells(row_number, 3).Value = Application.Range("DTRange").Cells(row_number - 1, 3).Value
                Next nCUGoods
               
a2:             Next xdocE
   
               
              Next i
                If Application.Range("DTRange").Cells(row_number, 5).Value = "" Then Application.Range("DTRange").Cells(row_number, 1).Value = ""
                If Application.Range("DTRange").Cells(row_number, 5).Value = "" Then Application.Range("DTRange").Cells(row_number, 2).Value = ""
                If Application.Range("DTRange").Cells(row_number, 5).Value = "" Then Application.Range("DTRange").Cells(row_number, 3).Value = ""
        End If
                         
    End With

End Sub

как вы и сказали вопросы остались Улыбка
Но они появились после того как захотелось еще одно поле увидеть
 sGoodsMarking = nCUGoods.SelectSingleNode("catESAD_cu:GoodsGroupDescription/catESAD_cu:GoodsGroupInformation/catESAD_cu:GoodsMarking").nodeTypedValue
И как оказалось оно есть не во всех ДТ. Когда код доходит до этих ДТ спотыкается и выдает ошибку. Подскажите как можно обойти эту ошибку. Пробовал On Error GoTo, но или не там прописывал или не правильно понял как им пользоваться.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #24 : 27.07.2021, 09:35:44 »

пробовал еще On Error Resume Next вначало кода впихнуть, тогда в те ДТ где этого поля нет прописывается значение из предыдущей ДТ. Мне надо чтобы поле осталось пустым.
« Последнее редактирование: 27.07.2021, 10:02:46 от dr_peper » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #25 : 27.07.2021, 10:39:37 »

Ну здесь надо просто включить логику и смекалку Улыбка
Код: (vb)
On Error Resume Next
sGoodsMarking="" 'обнуляем переменную, чтобы при возникновении ошибки она оставалась пустой
'пробуем запомнить в переменную значение. Если ошибка - переменная останется пустой
sGoodsMarking = nCUGoods.SelectSingleNode("catESAD_cu:GoodsGroupDescription/catESAD_cu:GoodsGroupInformation/catESAD_cu:GoodsMarking").nodeTypedValue

Примеров в сети по работе с  xml ДТ нет
Потому что они не отличаются от работы с любым другим XML. А примеров работы с узлами и схемами XML полно. Надо просто начинать вникать с саму работу с XML и все.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #26 : 27.07.2021, 14:25:15 »

примеров работы с узлами и схемами XML полно. Надо просто начинать вникать с саму работу с XML и все.
В тех примерах почему то всегда слишком простые до безобразия xml схемы и выборки делаются гораздо проще. С файлами ДТ они не работают. Вообще кроме Вас дельного никто больше не подсказал. Буду пробовать дальше разбираться. Из тех подсказок, что вы дали уже появилась какая то ясность в голове. Мне главное вытянуть все необходимое в excel дальше по старинке обработаю его в access.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #27 : 13.09.2021, 04:19:32 »

Возник вопрос: можно ли сразу тянуть из xml данные с конкретным значением.
Например: если тег <catESAD_cu:PresentedDocumentModeCode> = 0422 то берем значения из тегов <cat_ru:PrDocumentNumber> и <cat_ru:PrDocumentDate>.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #28 : 13.09.2021, 11:15:28 »

можно ли сразу тянуть из xml данные с конкретным значением
попробую угадать: таких примеров Вы тоже не нашли? Улыбка
если тег <catESAD_cu:PresentedDocumentModeCode> = 0422
лучше приведите полностью текст узла и скажите где искать 0422. Потому что есть подозрение, что Ваше понимания тега отличается от моего...Вполне возможно, что это не тег, а атрибут.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #29 : 14.09.2021, 01:02:20 »

попробую угадать: таких примеров Вы тоже не нашли? Улыбка лучше приведите полностью текст узла и скажите где искать 0422. Потому что есть подозрение, что Ваше понимания тега отличается от моего...Вполне возможно, что это не тег, а атрибут.


Возможно я как то неправильно формулирую свои запросы гуглу, т.к. редко получается найти что-нибудь стоящее.

В этой области находятся нужные данные //ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument

в таком теге должно быть 0422 (таких тегов с разным внутренним значением много) <catESAD_cu:PresentedDocumentModeCode>01999</catESAD_cu:PresentedDocumentModeCode>
эти 2 тего на выгрузку в таблицу <cat_ru:PrDocumentDate>2021-05-11</cat_ru:PrDocumentDate> и <cat_ru:PrDocumentNumber>2021</cat_ru:PrDocumentNumber>
« Последнее редактирование: 14.09.2021, 01:12:27 от dr_peper » Записан
Страниц: 1 [2] 3 4  Все   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru