Передача данных из Экселя на веб-сервер

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

ТЗ: есть таблица, пользователь тыркает на ней кнопку, запускается макрос, и вся таблица целиком отправляется на веб-сервер в инете. У меня на ум приходят два варианта:
- Программно сделать save as html, а потом получившийся файл тупо переслать на сервер - но как пересылать? Метод Publish работает по такому извратному протоколу, о существовании которого, похоже, знает он один.
- Опять же программно сохранить таблицу как htmlку, потом послать запрос серверу, в который в массив POST записать код свежесгенеренной странички, а на сервере повесить скрипт, который этот код запихает на страничку. Тогда вопрос, как из VBA послать запрос с данными в массиве POST?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

&quot писал(а):как из VBA послать запрос с данными в массиве POST
1) А нельзя просто сохранять данные на локальный диск и через FTP (вызываемому
из VBA) залить в публичный каталог Web сервера. А там подхватить скриптом?
2) Открыть из Excel страницу с WEB формой и sendkey ...
3) В цикле обращаться по адресу вашего серверного скрипта передавая очередную строку как параметр
Что то вроде http://my.web?myid=...,Row=.......................
На сервере обрабатывать обрашение и квитировать по некоему адресу считываемому макросом с помошью веб запроса

Это если не использовать дополнительных компонентов.
Иначе можно воспользоваться методом POST у XMLHTTPRequest.
Вообще, есть куча ActiveX умеющих делать POST ;)

P.S. Возможно вам покажется интересной ссылка
http://blogs.msdn.com/cumgranosalis/arc ... vices.aspx
Хотя это не совсем по теме.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Спасибо, буду пробовать
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

------
-- HTTP ActiveX v2.4.0 (c) Chilkat --
- Release Description:
- ~~~~~~~~~~~~~~~~~~~

HTTP client component for communicating with HTTP servers.

- Send GET, POST, or HEAD requests to an HTTP server.
- Supports SSL.
- Can save cookies to a persistant XML-based file store.
- Can automatically add cookies from a persistent file store to HTTP
requests.
- Sophisticated caching capabilities.
- Cache can extend across multiple hard drives.
- Supports Basic HTTP authentication (login/password).
- Supports HTTP proxies.
- Supports two caching algorithms: LMFactor and constant-freshness.
- Can automatically follow redirects.
- Provides read and connect timeout properties.
- Allows for custom HTTP request headers to be added to any request.
- Handles international (non-English) web pages including Asian and Middle
Eastern languages.
- Automatically manages a pool of connections with HTTP servers.
- Can mimic FireFox or Internet Explorer.
- Provides access to all HTTP response header fields.
- Supports XMLHTTP.
- Supports multipart/form-data for easy uploads to HTTP server.

http://forum.ru-board.com/topic.cgi?for ... art=480#13
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

В итоге сделалось через объект WebBrowser. Не самая быстрая вещь, но сойдет:

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

'**************************************** Post form data - begin
'sends form fields specified In Names/Values arrays To the URL
Sub PostRequest(URL, Names, Values)
  Dim I, FormData, Name, Value
  
  'Enumerate form names And it's values
  'and built string representaion of the form data
  For I = 0 To UBound(Names)
    'URL encode source fields
    Name = URLEncode(Names(I))
    Value = URLEncode(Values(I))
    If FormData <> "" Then FormData = FormData & "&"
    FormData = FormData & Name & "=" & Value
  Next
  
  IEPostStringRequest URL, FormData
End Sub

'sends URL encoded form data To the URL using IE
Sub IEPostStringRequest(URL, FormData)
  'Create InternetExplorer
  Dim WebBrowser: Set WebBrowser = CreateObject("InternetExplorer.Application")
  
  'You can uncoment Next line To see form results As HTML
  WebBrowser.Visible = True
  
  'Send the form data To URL As POST request
  Dim bFormData() As Byte
  ReDim bFormData(Len(FormData) - 1)
  bFormData = StrConv(FormData, vbFromUnicode)
  WebBrowser.Navigate URL, 2 + 4 + 8, , bFormData, _
    "Content-type: application/x-www-form-urlencoded" + Chr(10) + Chr(13)

  Do While WebBrowser.busy
'    Sleep 100
    DoEvents
  Loop
  MsgBox (WebBrowser.Document.body.innerhtml)
  'WebBrowser.Quit
End Sub

'URL encode of a string data
Function URLEncode(Data)
  Dim I, C, Out
  
  For I = 1 To Len(Data)
    C = Asc(Mid(Data, I, 1))
    If C = 32 Then
      Out = Out + "+"
    ElseIf C < 48 Then
      Out = Out + "%" + Hex(C)
    Else
      Out = Out + Mid(Data, I, 1)
    End If
  Next
  URLEncode = Out
End Function
'**************************************** Post form data - end
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Может если правильно объявить переменные немного побыстрее будет ? )
Я про строку
Dim I, FormData, Name, Value
- если i/ целое число, то можно объявить как Dim i As Long
- если FormData строка, то можно объявить так Dim FormData As String
- если Name строка, то можно объявить так Dim Name As String
- Не знаю какое у вас значение принимает переменная Value. Если целое число то Long, если строка, то String.
Ответить