将大型数据集发布到excel VBA的Web服务

Tro*_*ted 7 excel vba web-services excel-vba

你好Excel Excel vba编码员

我在excel表中有这个很好的宏,我根据用户输入的行编译XML - 之后它将xml发布到web服务.

您可以查看下面的代码 - 这很简单:

Set XMLHttpRequest = New MSXML2.XMLHTTP    
With XMLHttpRequest
    .Open "POST", URL, False
    .setRequestHeader "Content-Type", "text/xml; encoding='utf-8'"
    .setRequestHeader "Content-Length", strLength
    .send strXML
End With
Run Code Online (Sandbox Code Playgroud)

现在,当行数少于200行时,它的效果很好,但当行数超过1000行时,它会超时.我发布的XML字符串非常大,我很确定这是它超时的原因.

现在我的问题是,如何将这个超过1.000行,甚至超过20.000行的庞大数据集发布到Web服务?

到目前为止,我已花费大量时间在网络上寻找可能的解决方案,但尚未找到解决此问题的方法.到目前为止,我有以下想法来解决这个问题:

  • 将工作表复制到新工作簿,获取新工作簿的位置并将文件转换为Base64字符串,并将整个文件发布到新的.asmx服务并处理C#代码中的"工作簿".
  • 将巨大的字符串转换为某种字节数组并将其发布到新的.asmx webservice并处理C#代码.

我真的希望你们中的一个能指出我正确的方向并帮助我解决这个问题吗?

Tro*_*ted 1

好的 - 我找到了解决问题的方法,这似乎是处理这个问题的最佳方法。

我使用以下函数来复制工作簿:

Private Function saveAS(Path As String)
    Application.EnableEvents = False
    Application.DisplayAlerts = False

    ActiveWorkbook.Sheets.Copy
    ActiveWorkbook.saveAS Path, FileFormat:=51
    ActiveWorkbook.Close savechanges:=True

    Application.EnableEvents = True
    Application.DisplayAlerts = True
End Function
Run Code Online (Sandbox Code Playgroud)

然后我将文件编码为 base64 字符串,如下所示:

Private Function EncodeFileBase64(Filename As String) As String
    Dim arrData() As Byte
    Dim fileNum As Integer

    Filename = Filename + ".xlsx"
    fileNum = FreeFile
    Open Filename For Binary As fileNum
    ReDim arrData(LOF(fileNum) - 1)
    Get fileNum, , arrData
    Close fileNum

    Dim objXML As MSXML2.DOMDocument
    Dim objNode As MSXML2.IXMLDOMElement

    Set objXML = New MSXML2.DOMDocument
    Set objNode = objXML.createElement("b64")

    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeFileBase64 = objNode.Text

    Set objNode = Nothing
    Set objXML = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

然后我将编码后的字符串发送到我自己的 .asmx Web 服务并在 C# 中使用它。 Web 方法如下所示:

    [WebMethod]
    [ScriptMethod(UseHttpGet = true)]
    public string UploadXML(string base64string)
    {
        try
        {
            byte[] bytes = Convert.FromBase64String(base64string);

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                using (var package = new ExcelPackage(ms))
                {
                    ExcelWorkbook workBook = package.Workbook;
                    ExcelWorksheet settings = workBook.Worksheets.SingleOrDefault(w => w.Name == "sheet1");
                    ExcelWorksheet data = workBook.Worksheets.SingleOrDefault(w => w.Name == "sheet2");

                    //Getting data
                    string SS1 = (string)settings.Cells[8, 3].Value;
                    string ss2 = (string)settings.Cells[7, 3].Value;
                }
            }
            return "success";

        }
        catch (Exception ee)
        {
            return ee.Message;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我只需要找到一种好方法来提取智能算法中的所有数据,我认为这根本不会成为问题:)