从 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 个

配置导入选项
创建一个结构体,其中包含要在导入过程中使用的选项。列出 Excel 文件中包含需求的列和行的范围。
importOptions = struct("columns",[2 7],"rows",[3 56]);
添加信息以将需求数据从 Excel 中的需求映射到 Requirements Toolbox。将第 2 列、第 4 列和第 5 列映射到内置 slreq.Reference 属性 ID、Summary 和 Description。
importOptions.idColumn = 2; importOptions.summaryColumn = 4; importOptions.descriptionColumn = 5;
第 3 列、第 6 列和第 7 列不能直接映射到 slreq.Reference 属性。请将这些列映射到名为 orig_Type、Remark 和 Status 的自定义属性。请注意,Excel 中的需求类型映射到自定义属性,而不是映射到 slreq.Reference 对象的 Type 属性。
importOptions.attributes = {'orig_Type','Remark','Status'};
importOptions.attributeColumn = [3 6 7];将 slreqExamplePostImportXls 脚本注册为 PostImportFcn 回调。
importOptions.postImportFcn = "slreqExamplePostImportXls";导入需求
使用 slreq.import 将 ExampleRequirements 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 回调函数。如果您更新需求集,也会执行回调。

检查导入的需求类型
检查导入的需求,并将需求类型与 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 个子需求。

获取导入的需求 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 中的层次结构相匹配。
