2015-03-23 2 views
0

У меня есть веб-служба, которая вызывает другой веб-сайт, который позволяет мне загрузить из него файл excel. Это идет хорошо, но у пользователей возникает проблема с импортом в файл excel. Мне было поручено создать веб-версию, но я сам застрял в использовании файла.VB.NET Загрузить файл с удаленного сайта и манипулировать в памяти

Вот фрагмент кода, в котором я принудительно загружаю пользователя.

Dim fileName As String 
    fileName = "test.xls" 

    Dim stream As Stream = Nothing 
    Dim bytesToRead As Integer = 10000 
    Dim buffer As Byte() = New [Byte](bytesToRead - 1) {} 

    Try 
     Dim fileReq As HttpWebRequest = DirectCast(HttpWebRequest.Create(strURL), HttpWebRequest) 
     fileReq.Method = "GET" 
     fileReq.CookieContainer = LoginCookie 
     fileReq.ContentType = "application/x-www-form-urlencoded" 
     fileReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB7.5; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)" 

     Dim fileResp As HttpWebResponse = DirectCast(fileReq.GetResponse(), HttpWebResponse) 

     If fileReq.ContentLength > 0 Then 
      fileResp.ContentLength = fileReq.ContentLength 
     End If 

     stream = fileResp.GetResponseStream() 

     Dim resp = HttpContext.Current.Response 
     resp.ContentType = "application/vnd.ms-excel" 
     resp.AddHeader("Content-Disposition", "attachment; filename=""" & fileName & """") 
     resp.AddHeader("Content-Length", fileResp.ContentLength.ToString()) 

     Dim length As Integer 
     Do 
      If resp.IsClientConnected Then 
       length = stream.Read(buffer, 0, bytesToRead) 
       resp.OutputStream.Write(buffer, 0, length) 
       resp.Flush() 
       buffer = New [Byte](bytesToRead - 1) {} 
      Else 
       length = -1 
      End If 
     Loop While length > 0 
    Finally 
     If stream IsNot Nothing Then 
      stream.Close() 
     End If 
    End Try 

То, что я хотел бы сделать это вместо resp.Flush, я хотел бы сказать что-то вдоль линии

Открыть test.xls в памяти Read Sheets1.Cells (1,1) Вставить в DB (у меня есть этот код) kill test.xls в памяти

Могу ли я сделать это в памяти?

+0

Вы можете сохранить файл под именем темп на сервере, а затем открытое соединение OLEDB к нему. Затем вы можете запускать стандартные SQL-запросы, такие как SELECT, для чтения данных, например, DataTable, и манипулировать любым способом, который вы хотите. –

+0

У вас есть образец кода или ссылка для локального сохранения файла на сервере? – JuniorFlip

+0

Я положил это в свой ответ –

ответ

0

Вы можете сохранить файл под именем temp на сервере, а затем открыть для него OLEDB-соединение, прочитать файл и удалить его. Вот очень простой пример, как вы можете сохранить файл:

Если предположить, что буфер имеет файл, который вы читаете, вы можете использовать что-то вроде

Dim sSafeAsPath = "c:\temp\" & Path.GetRandomFileName 
Dim fs = New FileStream(sSaveAsPath, FileMode.Create, FileAccess.Write) 

fs.Write(buffer, 0, UBound(buffer)) 
fs.Close() 

Обратите внимание, что имя случайного файла используется, чтобы избежать столкновения - использование это имя, чтобы прочитать файл и удалить его, как только вы закончите. Также обратите внимание, что вашему приложению потребуется доступ для чтения/записи/удаления в папку, которую вы будете использовать для этих операций.

Вы можете узнать больше о том, как получить доступ к файлу Excel с помощью OLEDB в Connectionstrings.com

Смежные вопросы