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

2 つ目の 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);
        ref.overrideLocked('parent', 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 の組み込みのプロパティである IDSummary、および Description にマッピングします。

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

3 列目、6 列目、および 7 列目については、slreq.Reference のプロパティに直接マッピングできません。それらの列を orig_TypeRemark、および Status という名前のカスタム属性にマッピングします。Excel での要件タイプは、slreq.Reference オブジェクトの Type プロパティではなく、カスタム属性にマッピングされることに注意してください。

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

slreqExamplePostImportXls スクリプトを PostImportFcn コールバックとして登録します。

importOptions.postImportFcn = "slreqExamplePostImportXls";

要件のインポート

ExampleRequirements Excel ファイルの Requirements シートから ImportedFromExcel という名前の新しい要件セットに、slreq.import を使用して要件をインポートします。オプションの構造体から指定される追加のインポート オプションを使用して、プレーン テキストの参照要件として要件をインポートします。インポートされた参照要件の数、要件セットのファイル パス、および要件セットのハンドルを返します。

[count,reqSetFilePath,reqSet] = slreq.import("ExampleRequirements.xlsx", ...
    ReqSet="ImportedFromExcel",AsReference=true,RichText=false, ...
    subDoc="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 ファイルでの階層に基づいて作成されています。たとえば、要件 2.1.1 には、Excel では 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

参考

関連するトピック