Страницы: 1 2 След.
RSS
Экспорт из Эксель в XML, Редактирование XML с помощью Экселя
 
Здравствуйте!

Столкнулся с проблемой, что нужно  редактировать много разных xml (с разной структурой).
Мне как пользователю было бы удобнее открывать все xml в экселе вносить данные и сохранять обратно в xml.
Пример ниже открываю в Экселе и при попытке сохранить как тип XML получаю сообщение: "Карты XML не предназначены для экпорта" хотя документ сопоставлен с картой.

Можете подсказать решение или написать соответствующий макрос?
Скрытый текст
 
Прочитайте здесь ("Невозможно экспортировать карты XML в книге").
There is no knowledge that is not power
 
Читал ранее - все сделал не помогает.
 
Что-то Вы, значит, пропустили. Для эксперимента я удалил повторные элементы <Стоимость> (то есть оставил по одной штуке в <Все>) - экспорт прошёл успешно.
There is no knowledge that is not power
 
я так тоже могу, но фишка в том что удалять нельзя.
Поэтому прошу макрос:)
 
Значит, Эксель не может работать с такой структурой.
Почему бы не сделать структуру такой? Эксель при этом успешно экспортирует.
Скрытый текст
Изменено: SuperCat - 19.11.2016 17:05:40
There is no knowledge that is not power
 
Я не могу менять структуру xml поэтому и прошу не стандартное решение.
 
А что если изменить (через VBA) структуру исходного XML на предложенную мною и импортировать в Эксель?
There is no knowledge that is not power
 
А как потом экспортировать обратно в первоначальную структуру чтобы никто ничего не заметил?
и документов может быть много с разной структурой - хардкодить структуру и названия тэгов нельзя
Изменено: kolpakov - 19.11.2016 17:11:04
 
Да)
There is no knowledge that is not power
 
не решаемая задача?
 
Просто как обычный текстовый файл макросом сохраняйте. Но это если в открытом файле можно определить куда что заносить. Попробовал пример из 1 поста сохранить через блокнот и открыть экселем - ругается.
Изменено: Udik - 19.11.2016 17:32:42
Арфы - нет, возьмите бубен.
 
Цитата
Udik написал:
Просто как обычный текстовый файл макросом сохраняйте. Но это если в открытом файле можно определить куда что заносить
не понял совета.
 
Грубо говоря, построчно в файл выводятся данные и сохраняются. Но не видя как эксель открывает xml файлы, сказать не могу можно ли правильно сохранить.
Арфы - нет, возьмите бубен.
 
какая должна быть логика сохранения?
 
SuperCat , может быть повторяющиеся теги оборачивать в служебные, а при экспорте служебные тэги удалять?
 
Цитата
kolpakov написал: какая должна быть логика сохранения?
Ну вот на примере файла из 1 поста.
Сначала формируем строку из статичных и динамичных данных, потом заносим её в файл, переходим к следующей строке. Когда все строки вывели, сохраняем с расширением xml.
Сначала выводим неизменяемую строку
Цитата
<?xml version="1.0"  encoding="Windows-1251" ?>  
Потом пошли тэги, я вот не знаю можно по листу программно определить, что одни вложены в другие.
Цитата
<ОТЧЕТ>
<ОтчетПоТовару>
<Все>
Потом пошли теги с данными
Цитата
<Название>Стаканы</Название>  
Арфы - нет, возьмите бубен.
 
Tools -> References -> Microsoft XML, v6.0.
В папке с книгой будет создан файл "XML_MODIFIED.xml". Импортируйте его в эксель и попробуйте изменить.
Код
Sub CreaeteModifiedXML()

    Dim new_xml As DOMDocument60
    Dim xml As DOMDocument60
    Dim nodes_all As IXMLDOMNodeList
    Dim node_all_new As IXMLDOMNode
    Dim node_product As IXMLDOMNode
    Dim nodes_prices As IXMLDOMNodeList
    Dim node_price As IXMLDOMNode
    Dim node_all As IXMLDOMNode
    Dim new_node As IXMLDOMNode
    Dim node As IXMLDOMNode
    Dim sProductName$, sXmlFile$
    
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .InitialFileName = ThisWorkbook.Path & "\"
        With .Filters
            .Clear
            .Add "Файлы XML", "*.xml"
        End With
        If .Show() Then sXmlFile = .SelectedItems(1) Else Exit Sub
    End With

    Set new_xml = New MSXML2.DOMDocument60
    Set node = new_xml.appendChild(new_xml.createElement("ОТЧЕТ"))
    Set node = node.appendChild(new_xml.createElement("ОтчетПоТовару"))
    Set node_all_new = node.appendChild(new_xml.createElement("Все"))
    
    Set xml = New MSXML2.DOMDocument60
    xml.async = False
    xml.Load sXmlFile
    
    Set nodes_all = xml.SelectNodes("/ОТЧЕТ/ОтчетПоТовару/Все")
    For Each node_all In nodes_all
        sProductName = node_all.ChildNodes(0).Text
        Set nodes_prices = node_all.SelectNodes("Стоимость")
        For Each node_price In nodes_prices
            Set node_product = node_all_new.appendChild(new_xml.createElement("Товар"))
            node_all_new.appendChild node_product
            Set node = node_product.appendChild(new_xml.createElement("Название"))
            node.Text = sProductName
            Set node = node_product.appendChild(new_xml.createElement("Стоимость"))
            node.Text = node_price.Text
        Next
    Next
    
    new_xml.Save ThisWorkbook.Path & "\XML_MODIFIED.xml"

    MsgBox "Готово"

End Sub
There is no knowledge that is not power
 
Вы захардкодили тэги и структуру, а как быть с другим документом?
 
SuperCat, тут бесполезно писать как-либо макрос
Человек хочет редактировать ЛЮБОЙ (произвольный) XML файл в Excel,
а выпросить для ознакомления хоть один реальный XML файл у него невозможно (у меня за пару месяцев переписки не получилось)

Это примерно как попросили бы редактировать любой HTML файл в Word, - Word как бы умеет это делать, но не любой файл можно корректно открыть в нём,
и, не видя, с чем именно надо работать, ничего не сделать.
Тут всё то же самое, — ну не предназначен Excel для редактирования XML файлов произвольной структуры.
А когда заказчик всячески скрывает реальную структуру файла (говоря только о том, что она может быть любой), — задача переходит в разряд нерешаемых.
 
Игорь, когда он написал про "захардкорженность", то всё стало понятно. Если бы он изначально написал, что структура будет произвольной, то я бы и отвечать не стал.
Конкретно для этого XML можно сделать просимое, но для произвольной структуры - нет, конечно.
There is no knowledge that is not power
 
Доброе утро!
спасибо за ответы!
благодаря вам я понял что это не решаемая задача.
 
Подскажите  у меня подобная проблема но структура вроде одна,
Есть подраздел в XML в который  хочется добавить текст (данные в определенный подраздел)
но такой подраздел встречается в  других разделах.
( <CustomShiftGates> ..... </CustomShiftGates>)  отдельно отредактировать получается через Ноте++
но как это автоматизировать чтобы избежать ошибок.
Можно в бить фиктивную запись типа
(<CustomShiftGates>
<ShiftGate Description="Высокая Платформа" Location="560 9 70.61" RightBound="0" LeftBound="-0.055"/>
</CustomShiftGates)

А эк селем найти данный текст и заменить на необходимый и сохранить  новым файлом.
как реализовать макросом?
Изменено: drauzer - 29.09.2017 11:41:56
 
Доброе время суток.
Цитата
drauzer написал:
но такой подраздел встречается в  других разделах.
Можно описать как путь от корня до нужного подраздела, изучаем XPATH
Цитата
drauzer написал:
как реализовать макросом?
Изучаем и реализуем.
Успехов в пути.
 
Буду пробовать но пока для меня это темный лес. .....может кто  подкинет фонарик или прожектор.
Изменено: drauzer - 29.09.2017 11:42:33
 
Надо вставить в существующий XML CustomShiftGates?
There is no knowledge that is not power
 
Да но только CustomShiftGates встречается в каждом подразделе
Код
/LandXML/Alignments/Alignment[1]/Feature[2]. 

/LandXML/Alignments/Alignment[1]/Feature[2]/CustomShiftGates 
/LandXML/Alignments/Alignment[2]/Feature[3]/CustomShiftGates .....

Feature[2]  отличился  Feature[3] наверно из за того что разделы удалял чтобы XML сюда подгрузить.
Как определить какой будет Feature[?] ну или что в скобках?

( 1,2, Файла я сам конечно могу и отредактировать но надо как то сделать  это чудо в Exel чтобы коллегам не нужно было думать как это работает )
Изменено: drauzer - 29.09.2017 10:58:09
 
изменил расширение на ТХТ  XML не подгружает.

Подскажите еще сама программа от которой файл XML почему то записывает весь код строчку.
Хотя везде на форумах и в интернете обычно  все разбито на строки. это как то влияет на работу или только  для удобства чтения кода?
Изменено: drauzer - 29.09.2017 11:12:36
 
Всем здравствуйте! Чтобы не создавать новой темы напишу здесь, в принципе у меня вопросы по той же тематике, что и у ТС.
Мне необходимо в xml документе заменять значения некоторых атрибутов узлов. Для этого сформировал вот такой код:
Скрытый текст


Но вот незадача, атрибутов "Прокат 02-1,0х1250х2500-Ц140-М-ПС-ГОСТ 14918-2020" у меня несколько, а заменяется только один, первый. Как я позже догадался все дело, видимо, в ссылке SelectSingleNode, которая возвращает первый объект XmlNode, соответствующий выражению XPath. А вот найти аналог, который позволял бы выделять атрибуты во всем документе я не могу найти. Подскажите, пожалуйста, каким образом это сделать.
И еще вопрос вдогонку, у этого узла, в котором я меняю атрибут есть также достаточно других атрибутов. И такого рода узлов в документе также не мало. Помимо описанного выше атрибута мне также понадобится менять значение другого, соседствующего с ним, атрибута. Но этот новый атрибут уже более популярный, что ли. Он присутствует во многих узлах, в том числе и тех, где мне этот атрибут менять не нужно. Другими словами нужно заменять значение атрибута только в тех узлах, где значение одного из присутствующих атрибутов соответствует назначенному правилу - например иметь конкретное значение.
Буду очень благодарен за помощью\.
Изменено: jonny0 - 27.04.2022 16:43:47
 
SuperCat, Андрей VG, извините за наглость, обратите внимание на моё сообщение выше, пожалуйста. Можете помочь?
Страницы: 1 2 След.
Наверх