Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

从 Microsoft Excel 文档导入需求

此示例显示如何从 Microsoft® Excel® 文档导入需求。您可以将 Excel 电子表格中的列映射到某些需求属性和自定义属性。您还可以使用在需求导入后执行的回调为导入的需求分配特定值,例如需求类型或索引。您只能在 Microsoft Windows® 平台上从 Microsoft Excel 导入需求。

此示例使用 ExampleRequirements Excel 文件。要打开文件,请输入:

winopen("ExampleRequirements.xlsx")

编写 PostImportFcn 回调脚本

您可以编写一个脚本并将其注册为PostImportFcn回调,以便在导入完成后立即在 Requirements Toolbox™中处理导入的需求。此示例使用 slreqExamplePostImportXls 脚本作为 PostImportFcn 回调。输入以下命令查看脚本:

edit("slreqExamplePostImportXls.m")

需求默认从 Excel 导入,类型为 Functional。脚本中的第一个 for 循环迭代每个导入的需求以分配需求类型。循环从 Microsoft Excel 文件中检查原始需求类型,然后将导入的需求类型设置为与导入类型一致的内置 Requirements Toolbox 需求类型。如果 Excel 中的需求没有需求类型,则脚本会将该需求保留为 Functional 类型需求。

idToRef = containers.Map('KeyType','char','ValueType','Any');
topRefs = slreq.getCurrentObject;
reqSet = topRefs(1).parent;

refs = reqSet.find('type','Reference');
for i = 1:numel(refs)
    ref = refs(i);
    switch ref.getAttribute('orig_Type')
        case 'Heading'
            ref.Type = 'Container';
        case 'Note'
            ref.Type = 'Informational';
        otherwise
            % leave AS IS
    end
    % build the Map of IDs for the next step
    idToRef(ref.Id) = ref;
end

第二个 for 循环遍历每个导入的需求并应用 Excel 中定义的需求层次结构。

sortedIds = sort(keys(idToRef));
for i = 2:numel(sortedIds)
    thisId = sortedIds{i};
    % Find the parent ID by truncating this ID at the last '.'
    parentId = '';
    dotCharIdx = find(thisId == '.');
    if ~isempty(dotCharIdx)
        parentId = thisId(1:dotCharIdx(end)-1);
    end
    if ~isempty(parentId)
        ref = idToRef(thisId);
        parentObj = idToRef(parentId);
        setParent(ref,parentObj.SID);
    end
end

Excel 文件在需求 ID 中使用句点 (.) 来指示需求层次结构的不同级别。该脚本使用句点来识别层次结构级别并重新创建层次结构。

excelHierarchy.png

配置导入选项

创建一个包含导入期间要使用的选项的结构体。列出包含需求的 Excel 文件的列和行的范围。

importOptions = struct("columns",[2 7],"rows",[3 56]);

添加信息以将 Excel 中的需求需求映射到 Requirements Toolbox。将第 2、4 和 5 列映射到内置 slreq.Reference属性IDSummaryDescription

importOptions.idColumn = 2;
importOptions.summaryColumn = 4;
importOptions.descriptionColumn = 5;

第 3、6 和 7 列不能直接映射到 slreq.Reference属性。将这些列映射到名为 orig_TypeRemarkStatus的自定义属性。请注意,Excel 中的需求类型映射到自定义属性,而不是 slreq.Reference 对象的 Type属性。

importOptions.attributes = {'orig_Type','Remark','Status'};
importOptions.attributeColumn = [3 6 7];

slreqExamplePostImportXls脚本注册为PostImportFcn回调。

importOptions.postImportFcn = "slreqExamplePostImportXls";

导入需求

使用 slreq.importExampleRequirements Excel 文件中 Requirements 表的需求导入到名为 ImportedFromExcel 的新需求集。将需求作为纯文本引用需求导入,并从选项结构体中指定附加导入选项。返回导入的引用需求的数量、需求集文件路径以及需求集的句柄。

[count,reqSetFilePath,reqSet] = slreq.import("ExampleRequirements.xlsx", ...
    ReqSet="ImportedFromExcel",AsReference=true,RichText=false, ...
    subDoc="Requirements",options=importOptions);

保存导入的需求集,然后在需求编辑器中检查它。

save(reqSet);
explore(reqSet);

slreqExamplePostImportXls脚本被注册为 Import 节点的PostImportFcn回调函数。如果您更新需求集,回调也会执行。

postProcessedFromExcelResult.png

检查导入的需求类型

检查导入的需求并将需求类型与 Excel 中的需求进行比较。回调函数使用 Requirements Toolbox 内置类型为导入的需求分配类型。例如,需求 1 在 Excel 文件中具有类型 Heading,并导入类型为 Container

req1 = slreq.find(Type="Reference",Index="1");
originalType1 = getAttribute(req1,"orig_Type")
originalType1 = 
'Heading'
importedType1 = getAttribute(req1,"Type")
importedType1 = 
'Container'

需求 1.1 在 Excel 中具有类型 Note 并导入类型为 Informational

req2 = slreq.find(Type="Reference",Index="1.1");
originalType2 = getAttribute(req2,"orig_Type")
originalType2 = 
'Note'
importedType2 = getAttribute(req2,"Type")
importedType2 = 
'Informational'

需求 2.1.1 在 Excel 中没有指示类型,并使用 Functional 类型导入。

req3 = slreq.find(Type="Reference",Index="2.1.1");
originalType3 = getAttribute(req3,"orig_Type")
originalType3 =

  0×0 empty char array
importedType3 = getAttribute(req3,"Type")
importedType3 = 
'Functional'

检查导入的需求层次结构

检查导入需求的层次结构,并将层次结构与 Excel 文件进行比较。回调函数根据 Excel 文件中的层次结构创建了导入需求的层次结构。例如,Excel 中的需求 2.1.1 有 6 个子需求。

excelChildren.png

获取导入需求 2.1.1 的子需求。

childReqs = children(req3)
childReqs=1×6 object
  1×6 Reference array with properties:

    Id
    CustomId
    Artifact
    ArtifactId
    Domain
    UpdatedOn
    CreatedOn
    CreatedBy
    ModifiedBy
    IsLocked
    Summary
    Description
    Rationale
    Keywords
    Type
    IndexEnabled
    IndexNumber
    SID
    FileRevision
    ModifiedOn
    Dirty
    Comments
    Index

在 Excel 中,2.1.1 的第一个子需求的标题为 Cruise。获取数组中第一个子需求的摘要。

childSummary = childReqs(1).Summary
childSummary = 
'Cruise'

您还可以在需求编辑器中检查导入的需求层次结构是否与 Excel 中的层次结构相匹配。

importedHierarchy.png

另请参阅

相关主题