本文介绍了一种在Excel表格中实时录入并自动读取特定字段信息的解决方案。该方案使用VBA来触发事件,调用Python脚本进行数据查询,从而自动填充金蝶云星空系统中的FPOOrderEntry_FSeq和FRemainStockINQty字段信息。文中详细说明了Python脚本编写、VBA宏设置、JSON解析库添加等步骤。
要在Excel表格中实时录入FMaterialId.FNumber和FBillNO信息,并自动读取FPOOrderEntry_FSeq和FRemainStockINQty这两个字段记录,可以使用VBA(Visual Basic for Applications)来实现。VBA可以与Excel进行交互,并在单元格内容变化时触发事件,从而调用Python脚本进行数据查询。
以下是一个完整的解决方案(以读取采购订单数据为例):
1. 编写Python脚本
首先,编写一个Python脚本,该脚本接收FMaterialId.FNumber和FBillNO作为参数,并返回查询结果。
import json
import logging
from k3cloud_webapi_sdk.main import K3CloudApiSdk
# 配置日志记录
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 读取配置,初始化SDK
api_sdk = K3CloudApiSdk()
try:
api_sdk.Init(config_path='conf.ini', config_node='config')
except Exception as e:
logger.error(f"初始化SDK失败: {e}")
exit(1)
def query_data(material_id, bill_no):
# 请求参数
para = {
"FormId": "PUR_PurchaseOrder",
"FieldKeys": "FPOOrderEntry_FSeq,FRemainStockINQty",
"FilterString": f"FMaterialId.FNumber = '{material_id}' and FBillNO = '{bill_no}'",
"OrderString": "FID DESC",
"TopRowCount": 0,
"StartRow": 0,
"Limit": 0
}
try:
# 调用接口
response = api_sdk.ExecuteBillQuery(para)
# 转换成字典
data = json.loads(response)
except Exception as e:
logger.error(f"调用接口或数据转换失败: {e}")
return None
return data
if __name__ == "__main__":
import sys
if len(sys.argv) != 3:
print("Usage: python script.py <FMaterialId.FNumber> <FBillNO>")
exit(1)
material_id = sys.argv[1]
bill_no = sys.argv[2]
result = query_data(material_id, bill_no)
if result:
print(json.dumps(result))
else:
print("[]")
2. 编写VBA宏
在Excel中编写VBA宏,当单元格内容变化时,调用Python脚本并处理返回结果。
打开Excel,按 Alt + F11 打开VBA编辑器。
插入一个新模块,并添加以下代码:
Sub Worksheet_Change(ByVal Target As Range)
Dim materialId As String
Dim billNo As String
Dim pythonScriptPath As String
Dim cmd As String
Dim ws As Worksheet
Dim result As String
Dim jsonResult As Object
Dim row As Integer
Dim col As Integer
' 检查是否在指定的单元格发生变化
If Not Intersect(Target, Me.Range("A2:A1000,B2:B1000")) Is Nothing Then
materialId = Me.Cells(Target.Row, 1).Value
billNo = Me.Cells(Target.Row, 2).Value
pythonScriptPath = "E:\TOOLS\python\采购单条件组合查询SDK.py"
cmd = "python " & pythonScriptPath & " " & materialId & " " & billNo
' 调用Python脚本
result = ExecuteCmd(cmd)
' 解析JSON结果
Set jsonResult = JsonConverter.ParseJson(result)
' 写入结果到Excel
row = Target.Row
col = Target.Column
If jsonResult.Count > 0 Then
Me.Cells(row, 3).Value = jsonResult(1)("FPOOrderEntry_FSeq")
Me.Cells(row, 4).Value = jsonResult(1)("FRemainStockINQty")
Else
Me.Cells(row, 3).Value = ""
Me.Cells(row, 4).Value = ""
End If
End If
End Sub
Function ExecuteCmd(cmd As String) As String
Dim wsh As Object
Dim result As String
Set wsh = CreateObject("WScript.Shell")
result = wsh.Run("cmd.exe /c " & cmd, 0, True)
ExecuteCmd = result
End Function
3. 添加JSON解析库
为了解析Python脚本返回的JSON结果,需要添加一个JSON解析库。可以在VBA中使用JsonConverter.bas模块。
下载JsonConverter.bas模块并导入到VBA项目中。
确保在VBA编辑器中引用Microsoft Scripting Runtime库。
4. 配置Excel工作表
在Excel工作表中,设置标题行,例如:
A1: FMaterialId.FNumber
B1: FBillNO
C1: FPOOrderEntry_FSeq
D1: FRemainStockINQty
确保VBA宏绑定到工作表的Change事件。
5. 测试
在Excel的A列和B列中分别输入FMaterialId.FNumber和FBillNO,当单元格内容变化时,VBA宏将自动调用Python脚本并填充查询结果到相应的列。
通过这种方式,你可以在Excel表格中实时录入FMaterialId.FNumber和FBillNO信息,并自动从金蝶云星空读取FPOOrderEntry_FSeq和FRemainStockINQty这两个字段信息。
注:Python可以编译成exe文件再调用,conf.ini文件为金蝶API配置文件。
推荐阅读