2015-11-06 46 views
0

我有一个VBA应用程序正在与.Net网页进行通话以下载各种文件。我必须在VBA应用程序中使用的代码如下: -从.Net网站下载到VBA应用程序时Excel文件损坏

postDataString = "ID=" & SystemIdentificationCode & "&DevCode=" & ThisDeviceName & "&SysCode=" & SystemCode 
For i = 0 To UBound(PostArray) 
    postDataString = postDataString & "&f" & i & "=" & URLEncode(PostArray(i)) 
Next i 

Set HTT = CreateObject("Msxml2.ServerXMLHTTP.3.0") 
HTT.Open "Post", "http://" & IPAddress & ":" & PortAddress & "/CareControl/ShowDocument.ashx", False 
HTT.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
'HTT.setRequestHeader "Content-Type", "application/ms-excel" 

HTT.setRequestHeader "Content-Length", Len(postDataString) 
HTT.sEnd postDataString 

If HTT.Status = 200 Then 

    outputObject = HTT.responseBody 
    CallCloudForDocument = True 
Else 
    ErrorString = HTT.Status & ": " & HTT.statustext 
    CallCloudForDocument = False 
End If 
Set HTT = Nothing 

此代码连接到一个.net网站,我也放在一起。

现在,当我用PDF或JPEG文件使用此代码时,它工作正常。文档已下载,我可以将输出写入文件。

当我尝试使用Excel文件时,该对象已损坏。我的.Net代码也低于: -

Dim fInfo As New FileInfo(DocumentName) 
    Dim numBytes As Long = fInfo.Length 
    Dim fStream As New FileStream(DocumentName, FileMode.Open, FileAccess.Read) 

    Dim br As New BinaryReader(fStream) 

    Dim DocData As Byte() = br.ReadBytes(CInt(numBytes)) 
    If DocExt = "xls" Or DocExt = "xlsx" Then 
     context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
     context.Response.AppendHeader("content-disposition", "attachment;filename=Product_Report.xls") 
    Else 
     context.Response.ContentType = "image/jpeg" 
    End If 
'System.IO.File.WriteAllText(ConfigurationManager.ConnectionStrings("FileLogPath").ConnectionString, context.Response.ContentType) 
    context.Response.BinaryWrite(DocData) 

我的想法是,腐败必须发生的.NET版本页面上或VBA应用程序。因此,为了努力缩小范围,我使用.Net应用程序建立了一个测试平台。该测试工具调用该页面,但使用.Net Web Client。这工作正常,这表明.Net网站的输出是好的。测试装置代码如下: -

Dim webClient As New System.Net.WebClient 
webClient.Encoding = System.Text.Encoding.UTF8 

Dim responseArray As Byte() = webClient.UploadValues("http://192.168.1.64:/CareControl/ShowDocument.ashx", "POST", reqparm) 

Dim newFile As FileStream = File.Create("C:\test54.xlsx") 
newFile.Write(responseArray, 0, responseArray.GetLength(0)) 
newFile.Close() 
newFile.Dispose() 

所以问题必须在VBA代码中。但是,此代码适用于PDF /图像文件。

当我对文件进行分析时,由VBA代码生成的文件和由.Net测试工具生成的文件的唯一区别在于文件开头的顶部,看起来像是在开始时插入的一些虚假信息的文件。

任何意见将大大收到...

+0

它是如何腐败?您是否查看了下载的数据,以查看处理不当的服务器响应? –

+0

我会使用'application/vnd.ms-excel'作为MIME类型,尤其是如果您的支持.xls –

+0

您似乎强制.xlsx文件的扩展名为 –

回答

0

互联网是一件美好的事情!发现本文深藏在它的肠子埋: - http://www.cknotes.com/vb6-variant-vs-byte-array/

的关键段落是: - 。“有预先考虑到被保存内容的神秘额外的12个字节为什么?因为你保存的变体结构和内容是什么?的变种“

所以,使用了一个字节数组而不是一个变种和bobs你的叔叔!