Страницы: 1
RSS
Кодировка при создании файла Xml
 
Здравствуйте, уважаемые форумчане!  
 
Описание ситуации.    
Мне понадобилось в последнее время делать выгрузку данных из Excel в базу данных сайта. Делать это в формате xml куда быстрей.    
В настоящее время просто генерирую код на втором листе, копирую его и вставляю в xml файл. Всё замечательно "входит и выходит" :)  
Но мне этого было мало: я хотел сделать это красиво, с древовидной структурой. Сутки помучался и вроде всё получилось, но было замечено, что русские слова стали содержать в 2 раза больше символов, чем это было видно (на пример слово "Иван" содержит 8 символов, вместо 4-х.    
 
Похожее - в теме  
<EM>http://www.planetaexcel.ru/forum.php?thread_id=46351</EM>  
 
Вопрос.    
Что я делаю не так?  
 
Приложение.    
Я прилагаю файл в котором есть эта самая выгрузка. На втором листе файла есть пример подсчёта кол-ва символов у русского слова "Иван", скопированного из файла 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'")  
 
       ' ============== rootnode ===============  
       Set rootnode = .appendChild(.createElement("PriceConfiguration"))  
       rootnode.Attributes.setNamedItem(.createAttribute("Name")).Text = "123"  
       rootnode.Attributes.setNamedItem(.createAttribute("Version")).Text = PRICE_CONF_VERSION&  
 
       rootnode.appendChild(.createElement("Description")).Text = Description  
       rootnode.appendChild(.createElement("AuthorID")).Text = AuthorID  
 
 
       ' ============== filenode ===============  
       Set filenode = rootnode.appendChild(.createElement("File"))  
       filenode.Attributes.setNamedItem(.createAttribute("Type")).Text = PriceType  
 
       filenode.appendChild(.createElement("FilesMask")).Text = FilesMask  
 
       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
 
Здравствуйте, уважаемый EducatedFool!  
 
Я честно признаться у Вас на сайте взял функцию декодирования :)  
Я в примере сделал без этих строк, а так эти строчки есть в оригинале, хотя я их может не совсем правильным способом вставлял.    
Сейчас попробую сделать правильно - по Вашему.    
 
Обязательно отпишусь.    
 
С уважением,    
Пахом.
 
Я правильно понимаю - это инструкция с кодировкой?
 
я вообще ничего не понял из кода (хотя понятно что мне до такого уровня как до луны пешком).    
Если это инструкция, получается мне нужно перед запуском своего макроса, который формирует 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  
 
 
 
 
 
Чтобы воспользоваться кодом, добавьте его в стандартный модуль, и назначьте ему кнопку.  
Ваш макрос НЕ НУЖЕН. Ничего «активировать» не надо.  
Мой макрос - замена вашему. Какой использовать - выбор за вами.  
 
 
На выходе получается XML файл в нужной кодировке, такого вида:  
http://ExcelVBA.ru/pictures/20121016-pl8-80kb.jpg  
 
Вам ведь так нужно было?  
 
 
> Но я ооочень хотел бы сделать структуру читабельную  
 
Можно узнать, нафига?
 
Ну я такой. Люблю когда всё правильно. Хотя понимаю что это "ни фига" не нужно :)  
 
"Василий, ну неужели нельзя было по аналогии сделать?"  
Нет, потому что я не понимаю Вашего макроса, к сожалению.    
 
EducatedFool, спасибо.    
 
Буду разбираться и стремиться к более профессиональному программированию.    
 
С уважением и благодарностью,    
Василий.
Страницы: 1
Читают тему
Наверх