Excel VBA通过POST调用API获取二进制PNG图片遇类型不匹配问题
解决Excel VBA调用POST API获取二进制PNG图片的类型不匹配问题
问题背景
需要通过VBA向API发送POST请求传递JSON字符串,获取返回的二进制PNG图片并插入Excel。现有代码因错误使用字符串类型的ResponseText处理二进制响应,触发类型不匹配错误。
错误原因
- API返回的是二进制PNG数据,
ResponseText仅适用于文本格式响应,无法正确存储二进制内容,赋值给Byte类型变量会直接报错。 - 原代码中
d定义为单个Byte,但API返回的是完整的二进制数组,单个变量无法承载全部数据。
修正后的代码
Sub LoadQR() Dim jsonStr As String Dim objHTTP As Object Dim responseBytes() As Byte Dim filePath As String ' 获取JSON内容 jsonStr = Range("C5").Value ' 定义图片保存路径(建议用绝对路径,避免目录问题) filePath = ThisWorkbook.Path & "\qr.png" ' 创建HTTP请求对象(建议用6.0版本提升兼容性) Set objHTTP = CreateObject("MSXML2.XMLHTTP.6.0") objHTTP.Open "POST", "https://xxxxxxx/xxxx/api/qr/v1/gen", False objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" objHTTP.setRequestHeader "Content-Type", "application/json" ' 发送JSON请求 objHTTP.send jsonStr ' 获取二进制响应 responseBytes = objHTTP.ResponseBody ' 将二进制数据写入文件 Open filePath For Binary As #1 Put #1, , responseBytes Close #1 ' 将图片插入工作表 Dim myDocument As Worksheet Set myDocument = Worksheets(1) myDocument.Shapes.AddPicture _ fileName:=filePath, _ LinkToFile:=msoFalse, _ SaveWithDocument:=msoTrue, _ Left:=500, Top:=100, Width:=70, Height:=70 End Sub
关键修正点
- 改用
ResponseBody属性获取API返回的二进制字节数组,这是处理非文本响应的正确方式。 - 将单个Byte变量替换为字节数组
responseBytes(),用于存储完整的二进制图片数据。 - 使用
ThisWorkbook.Path生成绝对文件路径,避免因Excel当前工作目录变化导致找不到图片。 - 调整
AddPicture的参数命名,提升代码可读性,同时明确设置LinkToFile为msoFalse,确保图片嵌入Excel。
内容的提问来源于stack exchange,提问作者Ivan the Smurf
相关产品推荐
相关产品推荐

