You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Navision中通过C/AL代码实现行记录的Excel导出与导入

一、Excel导出实现

实现逻辑

通过C/AL调用Excel COM组件,初始化Excel实例后写入表头,遍历目标记录填充数据,最后调整格式完成导出。

代码示例(以销售订单行为例)

// 变量声明
VAR
    ExcelApp: Automation "Microsoft Excel 16.0 Object Library".Application;
    ExcelWorkbook: Automation "Microsoft Excel 16.0 Object Library".Workbook;
    ExcelWorksheet: Automation "Microsoft Excel 16.0 Object Library".Worksheet;
    RowIdx: Integer;
    ColIdx: Integer;
    SalesLine: Record "Sales Line";
BEGIN
    // 初始化Excel应用
    CLEAR(ExcelApp);
    ExcelApp := CREATE(Automation);
    ExcelApp.Visible := TRUE;
    ExcelWorkbook := ExcelApp.Workbooks.Add;
    ExcelWorksheet := ExcelWorkbook.Worksheets.Item(1);

    // 写入表头
    ColIdx := 1;
    ExcelWorksheet.Cells(1, ColIdx).Value := '文档编号'; ColIdx += 1;
    ExcelWorksheet.Cells(1, ColIdx).Value := '行号'; ColIdx += 1;
    ExcelWorksheet.Cells(1, ColIdx).Value := '物品编号'; ColIdx += 1;
    ExcelWorksheet.Cells(1, ColIdx).Value := '数量'; ColIdx += 1;
    ExcelWorksheet.Cells(1, ColIdx).Value := '单价'; ColIdx += 1;

    // 遍历记录写入数据
    RowIdx := 2;
    IF SalesLine.FINDSET THEN BEGIN
        REPEAT
            ColIdx := 1;
            ExcelWorksheet.Cells(RowIdx, ColIdx).Value := SalesLine."Document No."; ColIdx += 1;
            ExcelWorksheet.Cells(RowIdx, ColIdx).Value := SalesLine."Line No."; ColIdx += 1;
            ExcelWorksheet.Cells(RowIdx, ColIdx).Value := SalesLine."No."; ColIdx += 1;
            ExcelWorksheet.Cells(RowIdx, ColIdx).Value := SalesLine.Quantity; ColIdx += 1;
            ExcelWorksheet.Cells(RowIdx, ColIdx).Value := SalesLine."Unit Price"; ColIdx += 1;
            RowIdx += 1;
        UNTIL SalesLine.NEXT = 0;
    END;

    // 自动适配列宽
    ExcelWorksheet.UsedRange.Columns.AutoFit;

    // 可选:释放资源避免内存泄漏
    // CLEAR(ExcelWorksheet);
    // CLEAR(ExcelWorkbook);
    // CLEAR(ExcelApp);
END;

关键注意点

  • 确保客户端安装对应版本的Excel,且COM组件已正确注册(版本号如16.0对应Excel 2016+,可根据实际调整)。
  • 若需导出筛选后的数据,在FINDSET前添加筛选条件,例如SalesLine.SETRANGE("Document No.", Rec."No.")。
  • 可根据业务需求调整表头字段和记录映射关系。

二、Excel导入实现

实现逻辑

通过文件选择对话框获取导入文件路径,调用Excel COM组件读取数据,逐行解析后写入Navision记录,支持插入或更新操作,最后释放资源。

代码示例(以销售订单行为例)

// 变量声明
VAR
    ExcelApp: Automation "Microsoft Excel 16.0 Object Library".Application;
    ExcelWorkbook: Automation "Microsoft Excel 16.0 Object Library".Workbook;
    ExcelWorksheet: Automation "Microsoft Excel 16.0 Object Library".Worksheet;
    RowIdx: Integer;
    ColIdx: Integer;
    SalesLine: Record "Sales Line";
    ImportFileName: Text;
BEGIN
    // 选择导入的Excel文件
    IF NOT FILE.USE('选择导入文件', '', 'Excel文件 (*.xlsx)|*.xlsx', ImportFileName) THEN
        EXIT;

    // 初始化Excel后台实例
    CLEAR(ExcelApp);
    ExcelApp := CREATE(Automation);
    ExcelApp.Visible := FALSE;
    ExcelWorkbook := ExcelApp.Workbooks.Open(ImportFileName);
    ExcelWorksheet := ExcelWorkbook.Worksheets.Item(1);

    // 从第2行读取数据(第1行为表头)
    RowIdx := 2;
    WHILE NOT ExcelWorksheet.Cells(RowIdx, 1).Value = '' DO BEGIN
        CLEAR(SalesLine);
        SalesLine.INIT;

        // 映射Excel列到记录字段
        SalesLine."Document No." := ExcelWorksheet.Cells(RowIdx, 1).Value;
        SalesLine."Line No." := ExcelWorksheet.Cells(RowIdx, 2).Value;
        SalesLine."No." := ExcelWorksheet.Cells(RowIdx, 3).Value;
        SalesLine.Quantity := ExcelWorksheet.Cells(RowIdx, 4).Value;
        SalesLine."Unit Price" := ExcelWorksheet.Cells(RowIdx, 5).Value;

        // 插入或更新记录
        IF SalesLine.GET(SalesLine."Document No.", SalesLine."Line No.") THEN
            SalesLine.MODIFY
        ELSE
            SalesLine.INSERT;

        RowIdx += 1;
    END;

    // 关闭并释放资源
    ExcelWorkbook.Close(FALSE);
    ExcelApp.Quit;
    CLEAR(ExcelWorksheet);
    CLEAR(ExcelWorkbook);
    CLEAR(ExcelApp);

    MESSAGE('导入完成,共处理 %1 条记录', RowIdx - 2);
END;

关键注意点

  • 导入文件需严格匹配代码中定义的列顺序和数据格式,否则会导致数据错误。
  • 必须添加数据校验逻辑:比如检查必填字段非空、数值字段类型合法、关联记录存在(如物品编号是否有效),避免脏数据导入。
  • 建议添加事务处理,用COMMIT和ROLLBACK保证数据一致性,例如导入出错时回滚所有操作。

内容的提问来源于stack exchange,提问作者Annie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:55:55