Excel⽤VBA传数据到服务器
有个⾦融领域的需求,有⼀段excel的vba代码可以⾃动⽣成⾦融产品数据,要把这些数据在⽹页上(其实是微信公众号)展⽰,于是就需要把⽣成的数据发送到服务器并保存给⽹页⽤。
vba⾥⾯可以发送Http请求,笔者先把需要的数据拼成了1个Json字符串。真的是拼的,最好的⽅式肯定是序列化类实例,不过笔者以为vba不⽀持类,可能记糊涂了。不过后来发现vba居然⽀持类,但没有现成的json序列化⽅法,那么跟⾃⼰拼也没啥区别,就这么⽤了。ps,写vba真是浪费时间,⽐C#效率低多了,也没⽤vs这种强⼤的IDE。
Sub MakeJson()
Dim result, duedates, lists As String
Dim currentdate As String
Dim target As Range
Set target = Sheets("publish").Range("A1")
result = "["
Do
'开始处理标的
duedates = ""
lists = ""
If Len(result) <> 1Then
初中数学思维导图
黑枸杞子的功效与作用result = result + ","
End If
result = result + "{"
result = result + """exchange_code"":""" + target.Offt(1, 7).Value + ""","
result = result + """product_code"":""" + target.Offt(1, 8).Value + ""","
result = result + """link_contract"":""" + target.Offt(1, 0).Value + ""","
Do
Set target = target.Offt(1, 0)
If currentdate <> target.Offt(0, 1).Value Then
If duedates <> ""Then
duedates = duedates + ","
End If
currentdate = target.Offt(0, 1).Value
duedates = duedates + "\""" + currentdate + "\"""怎么可以怀孩子
End If
If lists <> ""Then
lists = lists + ","
End If
lists = lists & _
"{\""due_date\"":\""" & target.Offt(0, 1).Value & _
"\"",\""upward_buy\"":\""" & target.Offt(0, 2).Value & _
"\"",\""upward_delta\"":\""" & (target.Offt(0, 3).Value * 100) & _
"%\"",\""Kprice\"":\""" & target.Offt(0, 4).Value & _
"\"",\""weaker_buy\"":\""" & target.Offt(0, 5).Value & _
"\"",\""weaker_delta\"":\""" & (target.Offt(0, 6).Value * 100) & "%\""}"
Loop While target.Value = target.Offt(1, 0).Value
result = result + """link_contract_duedates"":""[" + duedates + "]"","
result = result + """link_contract_list"":""[" + lists + "]"""
result = result + """link_contract_list"":""[" + lists + "]"""
result = result + "}"
'检查是否换交易所了
If target.Offt(0, 7).Value <> target.Offt(1, 7).Value Then
'post val
result = result + "]"
Call UploadJson(target.Offt(0, 7).Value, result)
result = "["
End If
'检查还有没有⾏
Loop While target.Offt(1, 0).Value <> ""
End Sub
这个excel的表⾥⾯有个名叫publish的sheet,这个函数读取sheet的内容并拼接成1串笔者需要格式的json,这⾥只是个例⼦,具体根据⾃⼰的需要来拼。结尾部分⽤到⼀个函数UploadJson是⽤来把拼出来的json字符串上传到服务器的。
Sub UploadJson(exname, result)
我的好朋友作文100字'itemp = itemp + 1
'Sheets("tup").Range("E20").Offt(itemp, 0).Value = result
'Sheets("tup").Range("E20").Offt(itemp, 1).Value = Len(result)
'Dim MyData As New DataObject
'MyData.SetText result
'MyData.PutInClipboard
'上⾯的代码为debug时候显⽰json内容
Dim http
Set http = CreateObject("Microsoft.XMLHTTP")
http.Open"POST", "你的接收地址", Fal
http.nd "excode=" & exname & "&jsons=" & result
If http.Status = 200Then
MsgBox "上传" & exname & "交易所成功"
接口文档模板
El
简单幸福
MsgBox "上传" & exname & "失败,错误代码:" & http.Status
End If
End Sub
这就是上传代码,把json值和⼀些别的参数post到⾃⼰的api地址。值得⼀提的是上⾯注释掉的部分代
码,把字符串显⽰在excel的表格单元⾥查看结果,不过笔者的json字符串结果⽐较长,有200k的长度,⽽单元格只能存下32767个字符(很容易理解,32位整型范围),于是乎,就有了后⾯把字符串内容拷贝到剪贴板的代码,需要注意的是要先引⽤Microsoft Forms 2.0 Object Library,具体操作是⼯具-引⽤-浏览,选择C:\Windows\System32\FM20.dll
好了,数据上传了我们需要在服务器端接收,看看代码
Stopwatch watch1 = new Stopwatch();
watch1.Start();
JavaScriptSerializer rializer = new JavaScriptSerializer();
NameValueCollection req = PublicClass.FillFromEncodedBytes(ba.Request.BinaryRead(ba.Request.ContentLength), Encoding.UTF8);
try
{
if (req["excode"].Length > 0)
{
exjsonsBll eb = new exjsonsBll();鱼油能吃吗
if (exj == null)
{
exj = jsons();
exj.jsons = req["jsons"];
exj.CreatedTime = exj.LastUpdate = DateTime.Now;
eb.Add(exj);
}
Respon.Write("Success");
}
el
{
折耳根
Respon.Write("Failed");
}
}
catch (Exception ex)
{
new Thread(() => errorBll.log("interface_ExchangeData", ex.ToString(), "")).Start();
Respon.Write("Failed");
}
watch1.Stop();
new Thread((ThreadStart)(() => log_interfaceBll.add("wx_recExData", Convert.ToInt32(watch1.ElapdMilliconds)))).Start();
public static NameValueCollection FillFromEncodedBytes(byte[] bytes, Encoding encoding)
{
NameValueCollection values = new NameValueCollection();
int num = (bytes != null) ? bytes.Length : 0;
for (int i = 0; i < num; i++)
{
string str;
string str2;
int offt = i;
int num4 = -1;
while (i < num)
{
byte num5 = bytes[i];
if (num5 == 0x3d)
{
if (num4 < 0)
{
num4 = i;
}
}
el if (num5 == 0x26)
{
break;
}
i++;
}
if (num4 >= 0)
{
str = HttpUtility.UrlDecode(bytes, offt, num4 - offt, encoding);
str2 = HttpUtility.UrlDecode(bytes, num4 + 1, (i - num4) - 1, encoding);
}
el
{
str = null;
str2 = HttpUtility.UrlDecode(bytes, offt, i - offt, encoding);
}
values.Add(str, str2);
if ((i == (num - 1)) && (bytes[i] == 0x26))
{
values.Add(null, string.Empty);
}
}
return values;
}
上⾯有2段代码,第⼀段是接收页⾯的⼊⼝,⾥⾯设置了Stopwatch来监控这个接⼝的处理时间,做移动开发的时候还是很有⽤的信息,可以很好的计算出⼀个操作⼀共需要花费多少时间。最后⽤了ThreadStart来把处理时间写⼊数据库,线程的使⽤也很必要,不能耽误返回的时间。处理过程替换成⾃⼰的就⾏了。
第2段代码是前⾯⽤到的⽤来提取post过来的数据的函数,笔者放进标准类⾥⾯的,直接使⽤就⾏,不要深究。
好了,这时候可以在excel放⼀个按钮,点击以后执⾏vba代码,⾃动上传数据到服务器。你可能会问为什么要这么操作excel操作vba,嘿嘿,因为你可以把你的核⼼算法隔离出来,因为让⾦融⼈⼠写vba是可能的,做后⾯这些就是天⽅夜谈了。