高效数据管理:利用Python与Excel实现金蝶云数据库信息的实时读取与录入.原创
金蝶云社区-FanShine
FanShine
4人赞赏了该文章 218次浏览 未经作者许可,禁止转载编辑于2024年11月05日 08:30:41
summary-icon摘要由AI智能服务提供

本文介绍了一种在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配置文件。

推荐:结合EXCEL、VBA、PYTHON与金蝶API构建高效数字化系统整合方案

图标赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!