从 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 中使用句点 (.) 来指示需求层次结构的不同级别。该脚本使用句点来识别层次结构级别并重新创建层次结构。
配置导入选项
创建一个包含导入期间要使用的选项的结构体。列出包含需求的 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
的新需求集。将需求作为纯文本引用需求导入,并从选项结构体中指定附加导入选项。返回导入的引用需求的数量、需求集文件路径以及需求集的句柄。
[count,reqSetFilePath,reqSet] = slreq.import("ExampleRequirements.xlsx", ... ReqSet="ImportedFromExcel",AsReference=true,RichText=false, ... subDoc="Requirements",options=importOptions);
保存导入的需求集,然后在需求编辑器中检查它。
save(reqSet); explore(reqSet);
slreqExamplePostImportXls
脚本被注册为 Import 节点的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 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 中的层次结构相匹配。