如何在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
相关产品推荐
相关产品推荐

