你好,Excel vba coders
我的 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
现在,当行数少于 200 行时,它工作得很好,但当行号超过 1000 行时,它会超时。我发布的XML字符串非常大,我很确定这就是它超时的原因。
现在我的问题是,如何将这个超过 1.000 行,甚至可能超过 20.000 行的巨大数据集发布到 Web 服务?
到目前为止,我花了很多时间在网上寻找可能的解决方案,但还没有找到解决这个问题的方法。到目前为止,我有以下想法来解决问题:
- 将工作表复制到新工作簿,获取新工作簿的位置并将文件转换为 Base64 字符串,并将整个文件发布到新的 .asmx 服务,并在 C# 代码中处理"工作簿"。
- 将巨大的字符串转换为某种字节数组,并将其发布到新的 .asmx Web 服务并处理 C# 代码。
我真的希望你们中的一个人能为我指出正确的方向并帮助我解决这个问题?
不要将整个工作表作为单个对象发送,而是单独发送每一行。
这将需要修改您的 Web 服务以仅接受一行,而不是我猜当前作为行数组发送的内容。
这将允许您处理任意数量的行,因为您在任何时候处理的最多行正好是一行。
可能是服务器端的配置问题...看这篇文章 和这个。
好的 - 我找到了解决问题的方法,这似乎是处理此问题的最佳方法。
我使用以下函数制作工作簿的副本:
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
然后我将文件编码为 base64string ,如下所示:
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
然后我将编码的字符串发送到我自己的 .asmx Web 服务并在 C# 中使用它 网络方法如下所示:
[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;
}
}
我只需要找到一种在智能算法中提取所有数据的好方法,我认为这根本不会成为问题:)
我知道你有一个解决方案,但我想发表意见......
如果数据真的如此表格化,那么它不应该在像SQL Server这样的数据库中吗? 如果要上传到数据库,则SQL Server具有一些不错的批量上传功能,可以有效地加载工作簿。