Экспорт данных листов excel в xml
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Экспорт данных листов excel в xml Expand / Collapse
Автор
Сообщение
06.02.2007 18:36
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
В своем приложении я экспортирую данные листов Excel в xml файл.
Делаю я это примерно так:


Sub send_to_xml_Click()
Dim strConnectString$, strSQL$, strHeading$
Dim cnn As ADODB.Connection
Dim rs As Recordset

'листаем книгу
For i = 1 To ThisWorkbook.Sheets.Count
' For Each f In Worksheets(i).Range(Module3.scan_diap)
''''''''''''''''''''''''''и превращаем данные в record set
NameDir = ThisWorkbook.Path & "\"
strConnectString = "Provider=MSDASQL.1;Persist Security Info=True;" & _
"Data Source = Файлы Excel;Initial Catalog=" & NameDir

'strConnectString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Persist Security Info=False;" & _
"Data Source=C:\vb-db\xmltest.mdb"
'scan_diap
strSQL = "SELECT * FROM [" & Worksheets(i).Name & "$" & Module3.scan_diap & _
"] IN '" & ThisWorkbook.FullName & "' [Excel 5.0;HDR=NO;IMEX=2];"

strHeading$ = "preds"
Set cnn = New ADODB.Connection
Set rs = New ADODB.Recordset
cnn.Open strConnectString$ ' устанавливаем связь
Set rs = cnn.Execute(strSQL) ' создаем Recordset
Call ExportXML(rs, strHeading$, strCode, "d:\file1.xml") 'грузим в xml
' Next f
Next i

End Sub
Public Sub ExportXML(rs As Recordset, strHeading$, strCode, FileName$) '

' Экспорт таблицы RecordSet в XML файл
Dim xmlDoc As DOMDocument

' Cоздаем XMLDOM-объект
Set xmlDoc = RecordsetToXMLDOM(rs, strHeading$, strCode) '
' выводим его в виде отдельного файла
xmlDoc.Save FileName$
End Sub
Public Function RecordsetToXMLDOM(rs As Recordset, strHeading$, strCode) As DOMDocument '
'
' Преобразование Recordset в DOMDocument
'
Dim fldField As Field
Dim xmlDoc As DOMDocument
Dim xmlFields As IXMLDOMElement
Dim xmlField As IXMLDOMElement
Dim i&

' создание экземпляра объекта
Set xmlDoc = CreateObject("Microsoft.XMLDOM") ' New DOMDocument
' записываем XML-константу объекта
xmlDoc.loadXML "" + _
Replace("<" + strHeading + "/>", " ", "_")
' Replace("<" + strHeading + "/>", " ", "_")

With rs
' Вывод содержимого полей таблицы
.MoveFirst: i = 1
Do Until .EOF

' создание нового узла
Set xmlFields = xmlCode.documentElement.appendChild _
(xmlDoc.createElement("OneRow" + LTrim(Str(i))))

For Each fldField In rs.Fields ' запись полей записи
Set xmlField = xmlFields.appendChild( _
xmlDoc.createElement(Replace(fldField.Name, " ", "_")))
If IsNull(fldField.Value) = False Then
xmlField.Text = fldField.Value
End If
Next
.MoveNext ' к следующей записи набора
i = i + 1
Loop
End With
Set RecordsetToXMLDOM = xmlDoc ' возвращаем созданный объект
End Function


Полученный xml я предполагаю использовать для web отображения данных. Заставлять пользователя вручную копировать файл из локальной fs на сервер не есть хорошо. Очевидно, что метод xmlDoc.Save FileName$ не сработает, если я вместо локального пути укажу url удаленного web-сервера. Как решить эту проблему?

С уважением,
Сообщ. #910481
06.02.2007 19:25
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Конечно я мог бы положить этот файл на сервер через подключение сетевого диска (API), но зная локальную сеть предприятия, где это будет работать, думаю, что это не приемлимо. Использование active-x ftp компонент сторонних производителей известных в сети, тоже не подойдет.

С уважением,
Сообщ. #910485
08.02.2007 14:06


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 03.03.2008 16:40
Сообщ.: 443, Visits: 4 574
Ну, если в API есть функция загрузки URLDownloadToFile, должна быть и функция выгрузки. Я бы там поискал. Лежит она наверняка в urlmon.dll.
Сообщ. #910566
08.02.2007 15:50
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Спасибо за отклик. Буду искать.

С уважением,
Сообщ. #910584
08.02.2007 16:52
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Можно еще два способа попробовать:

1) В Windows есть программа для работы с ftp с командной строки. У нее есть удобный параметр -s позволяющий подать на вход команды из внешнего файла. В первой строки пишем имя, во второй пароль, затем нужные команды по загрузке файла и, в конце, команда bye для отключения. Запустить внешнуюю программу из Excel не должно составить труда.

2) Организовать на веб-сервере страницу для upload-а файлов и обращаться к ней из Excel с помощью стандартного компонента XmlHttpRequest.

На мой взгляд первый способ проще всего. Его недостаток в невозможности проконтролировать успех/неуспех операции по загрузке файла.

Сообщ. #910590
08.02.2007 17:29
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Спасибо за совет. 1 вариант будет запасным (очень трудно "уломать" заказчика поднять ftp сервер).
нашел пример: http://www.motobit.com/tips/detpg_uploadvbaie/
Попробовал на localhost
Call UploadFile("http://localhost", "C:\1.xml")
вроде все отрабатывает без ошибок, но файл не копируется.

С уважением,
Сообщ. #910595
08.02.2007 17:53
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
babken76 (08.02.2007)
нашел пример: http://www.motobit.com/tips/detpg_uploadvbaie/
Попробовал на localhost
Call UploadFile("http://localhost", "C:\1.xml")
вроде все отрабатывает без ошибок, но файл не копируется.

А у тебя на localhost есть скрипт обрабатывающий upload? Без него работать не будет.

Сообщ. #910596
08.02.2007 18:06
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Bazile, ты как всегда прав. Не внимательно прочел. Не могу только его найти на этом сайте.

С уважением,
Сообщ. #910598
29.05.2007 18:12
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being