主要内容

从 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 中使用句点 (.) 来指示需求层次结构的不同级别。该脚本为导入的需求集维护正确的需求层次结构,如下所述:

  • 在需求 ID 中使用句点来标识不同的层次结构级别

  • 在每个级别的前九个需求中使用前导零

  • 每个级别的需求少于 100 个

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 的新需求集中。将需求作为纯文本引用需求导入,并从 options 结构体中指定其他导入选项。返回导入的引用需求的数量、需求集文件路径和需求集的句柄。

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

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

save(reqSet);
explore(reqSet);

slreqExamplePostImportXls 脚本被注册为导入节点的 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 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

另请参阅

函数

主题