Страница 1 из 1

VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 28 ноя 2007, 13:04
sidal
Народ подскажите есть ли какая-то возможность работы с xml-файлами при помощи Excel 2000 VBA или Access 2000 VBA.

Если более конкретно по задаче, то задача следующая:

Есть xml-файл, который лежит в какой-то директории, в этой же директории лежит dbf файл.

Формат xml-файла примерно такой:
<Файл>

<Запись>
<Идентификатор>A01</Идентификатор>

<ФИО>
<Фамилия>Иванов</Фамилия>
<Имя>Иван</Имя>
<Отчество>Иванович</Отчество>
</ФИО>

<Данные о работодателе>
<ИНН>1111111111111</ИНН>
<КПП>1111111111111</КПП>
<ОКАТО>1111111111111</ОКАТО>
</Данные о работодателе>
</Запись>

<Запись>
<Идентификатор>A02</Идентификатор>

<ФИО>
<Фамилия>Петров</Фамилия>
<Имя>Петр</Имя>
<Отчество>Петрович</Отчество>
</ФИО>

<Данные о работодателе>
<ИНН>2222222222222</ИНН>
<КПП>2222222222222</КПП>
<ОКАТО>2222222222222</ОКАТО>
</Данные о работодателе>
</Запись>


</Файл>

Формат dbf-файла примерно такой:

Фамилия| Имя | Отчество | ИНН| КПП| ОКАТО|
------------------------------------------------------
Иванов |Иван| Иванович|7777|7777|777777|
Петров |Петр| Петрович |7777|7777|777777|

И требуется брать по одной записи из xml-файла проверять "Данные работодателя" на совпадение с данными по этому человеку в dbf-файле, если данные совпадают то не трогаем запись по этому человеку в xml-ке, если не совподает, то заменить "Данные работодателя" в xml-файле на те которые в dbf-ке. Т.е. на выходе должен быть xml-файл в котором тег "Данные работодателя" полностью эдентичен записям в dbf-файле.

Заранее благодарен всем откликнувшимся.

P.S. Если средствами Excel 2000 VBA или Access 2000 VBA это не достежимо, то так и напишите. Буду писать на Delphi!!! ;)

P.P.S. Отвечая на вопрос почему сразу не пишу на Delphi, говорю потому что бухгалтерия для которой это пишется не хочет программу, а хочет макрос :confused:

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 28 ноя 2007, 13:40
Aent
Если делать в 2000 - проще всего самому парсить XML. Так как файл у вас очень
простой структуры и если не требуется мобильность приложения можно IMHO не связываться с DLL и DOM а запрограммировать всё "в лоб" на VBA. Проосто читаете файл в строку и простейшим автоматом парсите его. Для чтения dbf то же в вашем случае проше всего воспользоваться не DAO или ADO а специализированным классом Бориса Файфеля (взять можно на http://catstail.narod.ru/)
Кстати, по вашему посту непонятно что является объединяющим наборы ключём. ФИО для этого не очень подходит. Cкажем в моей организации
4 полных тёзки...
А если значение имеет порядковый номер записи в файлах, то по вашей постановке можно просто забыть о входном XML файле, создавая
результирующий XML просто на основе dbf.

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 28 ноя 2007, 15:51
sidal
Aent писал(а):Если делать в 2000 - проще всего самому парсить XML. Так как файл у вас очень
простой структуры и если не требуется мобильность приложения можно IMHO не связываться с DLL и DOM а запрограммировать всё "в лоб" на VBA. Проосто читаете файл в строку и простейшим автоматом парсите его. Для чтения dbf то же в вашем случае проше всего воспользоваться не DAO или ADO а специализированным классом Бориса Файфеля (взять можно на http://catstail.narod.ru/)
Кстати, по вашему посту непонятно что является объединяющим наборы ключём. ФИО для этого не очень подходит. Cкажем в моей организации
4 полных тёзки...
А если значение имеет порядковый номер записи в файлах, то по вашей постановке можно просто забыть о входном XML файле, создавая
результирующий XML просто на основе dbf.
Ключом является набор из ФИО, паспортных данных и места прописки, просто в первом посте я очень сильно упростил структуру и xml-файла и dbf-чтоб не расписывать все досконально.

В лоб читать и парсить как текст не получится, так бы и вопроса не возникало, т.к. некоторые xml-ки достигают 5-10 тыс записей. А такое количество символов насколько мне известно (правда я могу и заблуждаться :) ) не потянет ни одна текстовая переменная!

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 29 ноя 2007, 00:17
Aent
Максимальная длина для переменной типа string в VBA - 2 миллиарда символов.
По поводу парсинга XML тогда смотрите:
http://www.microsoft.com/Rus/Msdn/Activ ... mlDom.mspx
http://www.xml.com/pub/a/2000/07/12/vbasic/example.html
http://www.script-coding.info/XMLDOMscripts.html
http://www.visual.2000.ru/develop/ms-vb ... ml-doc.htm
http://www.visual.2000.ru/develop/ms-vb ... htm#tip376

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 29 ноя 2007, 09:13
sidal
Спасибо большое за советы!

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 29 ноя 2007, 12:34
Serge_Bliznykov
sidal, а я позволю себе привести тут кусочек чужого кода.
(с) genyaa

Код: Выделить всё

Можно попробовать использовать FileSystemObject для чтения всего файла полностью в строковую переменную. 
Думаю, что полученную строку будет не сложно анализировать 
(да, и кстати, файл прочтется очень быстро, за одно обращение к диску):

Sub nnn()
Dim s As String, fs As Object, a As Object
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
If .Show = False Then Exit Sub
f = .SelectedItems(1)
End With

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile(f)
s = a.readall
a.Close
Debug.Print Len(s)
'строка s содержит все байты всего файла (до 2^31 байт, т.е до ~2.1Гб)
End Sub

Re: VBA (Excel 2000 или Access 2000) и xml файлы

Добавлено: 29 ноя 2007, 19:57
Aent
&quot писал(а):да, и кстати, файл прочтется очень быстро, за одно обращение к диску
Обычный GET прочтёт ещё быстрее. И не надо FSO - достаточно VBA :)
Код будет всего на строчку длинее ...