Excel的开发,方式多种多样,常见的有 开发Excel的加载项,Excel的外接程序,宏。各有各的特点,前两者开发难度低,不过不同Excel版本间的兼容性差,使用宏开发,难度比较大,用的都是古老的vb,不过兼容性还是很好的。
这里,使用了宏进行开发,同时还用到了C#。原理是这样的,使用宏,发送http请求到C#开发的本地http服务器,处理完毕后将结果返回。
演示的示例是,将第一列的明文,用第二列的密码加密,加密后保存在第三列。http url编码使用utf-8编码,返回Base64的加密结果
Public Function UrlEncode(ByRef szString As String) As String
Dim szChar As String
Dim szTemp As String
Dim szCode As String
Dim szHex As String
Dim szBin As String
Dim iCount1 As Integer
Dim iCount2 As Integer
Dim iStrLen1 As Integer
Dim iStrLen2 As Integer
Dim lResult As Long
Dim lAscVal As Long
szString = Trim$(szString)
iStrLen1 = Len(szString)
For iCount1 = 1 To iStrLen1
szChar = Mid$(szString, iCount1, 1)
lAscVal = AscW(szChar)
If lAscVal >= &H0 And lAscVal <= &HFF Then
If (lAscVal >= &H30 And lAscVal <= &H39) Or _
(lAscVal >= &H41 And lAscVal <= &H5A) Or _
(lAscVal >= &H61 And lAscVal <= &H7A) Then
szCode = szCode & szChar
Else
szCode = szCode & "%" & Hex(AscW(szChar))
End If
Else
szHex = Hex(AscW(szChar))
iStrLen2 = Len(szHex)
For iCount2 = 1 To iStrLen2
szChar = Mid$(szHex, iCount2, 1)
Select Case szChar
Case Is = "0"
szBin = szBin & "0000"
Case Is = "1"
szBin = szBin & "0001"
Case Is = "2"
szBin = szBin & "0010"
Case Is = "3"
szBin = szBin & "0011"
Case Is = "4"
szBin = szBin & "0100"
Case Is = "5"
szBin = szBin & "0101"
Case Is = "6"
szBin = szBin & "0110"
Case Is = "7"
szBin = szBin & "0111"
Case Is = "8"
szBin = szBin & "1000"
Case Is = "9"
szBin = szBin & "1001"
Case Is = "A"
szBin = szBin & "1010"
Case Is = "B"
szBin = szBin & "1011"
Case Is = "C"
szBin = szBin & "1100"
Case Is = "D"
szBin = szBin & "1101"
Case Is = "E"
szBin = szBin & "1110"
Case Is = "F"
szBin = szBin & "1111"
Case Else
End Select
Next iCount2
szTemp = "1110" & Left$(szBin, 4) & "10" & Mid$(szBin, 5, 6) & "10" & Right$(szBin, 6)
For iCount2 = 1 To 24
If Mid$(szTemp, iCount2, 1) = "1" Then
lResult = lResult + 1 * 2 ^ (24 - iCount2)
Else: lResult = lResult + 0 * 2 ^ (24 - iCount2)
End If
Next iCount2
szTemp = Hex(lResult)
szCode = szCode & "%" & Left$(szTemp, 2) & "%" & Mid$(szTemp, 3, 2) & "%" & Right$(szTemp, 2)
End If
szBin = vbNullString
lResult = 0
Next iCount1
UrlEncode = szCode
End Function
Public Function http(msg As String, password As String) As String
Dim Url As String
Url = "http://127.0.0.1:8080/AES?msg=" & UrlEncode(msg) & "&password=" & UrlEncode(password)
Dim objHttp As Object
Set objHttp = CreateObject("msxml2.xmlhttp")
objHttp.Open "GET", Url, 0
objHttp.send
While objHttp.readystate <> 4
DoEvents
Wend
http = objHttp.responsetext
End Function
Sub AES加密()
Dim i As Integer
i = 1
Do While Not IsEmpty(Cells(i, 1))
If Not IsEmpty(Cells(i, 2)) Then
Cells(i, 3) = http(Cells(i, 1), Cells(i, 2))
End If
i = i + 1
Loop
End Sub
加密后,结果如上表格所示,这里的加密方式,是参照CryptoJS进行的,之所以选择这种方式,在于AES在线加密解密,均采用此标准,需要解密的时候,可以快速得找到解密的工具,例如:http://tool.oschina.net/encrypt。CryptoJS怎样加解密的,可以查看本博客的其他文章。
利用http请求,再加上简单的宏,就可以处理很多的复杂事情。比如生成二维码,各种各样的加密解密,同时又保证与Excel各版本的兼容性,甚至可以在xp和excel2003上使用。
代码:https://download.csdn.net/download/liangjintang/10364499