Описание ситуации. Мне понадобилось в последнее время делать выгрузку данных из Excel в базу данных сайта. Делать это в формате xml куда быстрей. В настоящее время просто генерирую код на втором листе, копирую его и вставляю в xml файл. Всё замечательно "входит и выходит" :) Но мне этого было мало: я хотел сделать это красиво, с древовидной структурой. Сутки помучался и вроде всё получилось, но было замечено, что русские слова стали содержать в 2 раза больше символов, чем это было видно (на пример слово "Иван" содержит 8 символов, вместо 4-х.
Приложение. Я прилагаю файл в котором есть эта самая выгрузка. На втором листе файла есть пример подсчёта кол-ва символов у русского слова "Иван", скопированного из файла xml после выгрузки.
А вы формируйте XML нормально, первой строкой добавив в него инструкцию с кодировкой И проблем не будет.
Пример: (для работы кода, надо в tools-references поставить галочку для библиотеки Microsoft XML v6.0)
Sub test() xmlpath$ = ThisWorkbook.Path & "\gallery2.xml"
Dim xml As DOMDocument, rootnode As IXMLDOMElement Dim filenode As IXMLDOMElement, sheetnode As IXMLDOMElement Set xml = CreateObject("Microsoft.XMLDOM")
With xml .appendChild .createProcessingInstruction("xml", "version='1.0' encoding='windows-1251'")
With filenode.appendChild(xml.createElement("XLSoptions")) .appendChild(xml.createElement("Password")).Text = Password .appendChild(xml.createElement("MergeXLSsheets")).Text = Abs(CInt(MergeXLSsheets)) End With
If Len(xmlpath$) > 0 Then .Save xmlpath$ End With End Sub
Я честно признаться у Вас на сайте взял функцию декодирования :) Я в примере сделал без этих строк, а так эти строчки есть в оригинале, хотя я их может не совсем правильным способом вставлял. Сейчас попробую сделать правильно - по Вашему.
я вообще ничего не понял из кода (хотя понятно что мне до такого уровня как до луны пешком). Если это инструкция, получается мне нужно перед запуском своего макроса, который формирует xml файл, активировать Ваш?
Поскольку я ничего не понимаю то для меня естественно более правильным будет делать по простому (см. самый первый пост). Но я ооочень хотел бы сделать структуру читабельную. Поэтому надеюсь что мне подсобят.
Василий, ну неужели нельзя было по аналогии сделать?
вот вариант кода под ваши данные:
Sub test2() On Error Resume Next xmlpath$ = ThisWorkbook.Path & "\gallery3.xml"
Set xml = CreateObject("Microsoft.XMLDOM")
Dim ra As Range, cell As Range Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp)) ' заполненные строки
' задаем кодировку для XML xml.appendChild xml.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'")
' глявный узел Set rootnode = xml.appendChild(xml.createElement("MyTable")) rootnode.Attributes.setNamedItem(xml.createAttribute("Name")).Text = ThisWorkbook.Name
' добавляем дочерние узлы для каждой строки For Each cell In ra.Cells ' перебираем все строки
With rootnode.appendChild(xml.createElement("Employee")) ' создаём узел в XML ' и добавляем в него значения .Attributes.setNamedItem(xml.createAttribute("ID")).Text = cell.Value
For i = 2 To 12 ' для каждого столбца ColumnName$ = Cells(1, i) .appendChild(xml.createElement(ColumnName$)).Text = cell.EntireRow.Cells(i) Next End With Next cell
xml.Save xmlpath$ ' сохраняем XML End Sub
Чтобы воспользоваться кодом, добавьте его в стандартный модуль, и назначьте ему кнопку. Ваш макрос НЕ НУЖЕН. Ничего «активировать» не надо. Мой макрос - замена вашему. Какой использовать - выбор за вами.