0

他の 2 つのドキュメントのコンテンツからマトリックスを作成する必要があります。例えば:

  1. doc には次のようなフィールドがあります。

    4.2 要件 A Blah

  2. doc には次のようなフィールドがあります。

    2.1 分析 A Blah Blah

次のような別のドキュメント (トレーサビリティ マトリックスと呼ばれる) を作成します。

Col1    Col2    Col3
4.2     2.1     Blah Blah Blah

4.2 と 2.1 は、doc3 で動的に更新する必要があります。

ハイパーリンク、相互参照を使用して確認しましたが、異なるドキュメントを結合するのに役立つものはないようです. とにかくこれを行うことはありますか?

編集:ここに例があります:

Technical Specification Num         Requirement Num     Requirement
4.2                                 2.1                 A sentence that explains the relationship btw 2 cols: Technical Specification and Requirement Num
4

1 に答える 1

1

MS Word Interop と C# を使用してこれを実装する方法の実例を作成しました。

コードには、最も興味深い部分を説明するコメントが含まれています。

サンプルは、以下を使用して C# コンソール アプリケーションとして実装されます。

  • .NET 4.5
  • Microsoft Office Object Library バージョン 15.0、および
  • Microsoft Word オブジェクト ライブラリ バージョン 15.0

... つまり、MS Office 2013 Preview に同梱されている MS Word Interop API です。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;

namespace WordDocStats
{
    internal class Program
    {
        private static void Main()
        {
            // Open word
            var wordApplication = new Application() { Visible = true };

            // Open document A, get its headings, and close it again
            var documentA = wordApplication.Documents.Open(@"C:\Users\MyUserName\Documents\documentA.docx", Visible: true);
            var headingsA = GetHeadingsInDocument(documentA);
            documentA.Close();

            // Same procedure for document B
            var documentB = wordApplication.Documents.Open(@"C:\Users\MyUserName\Documents\documentB.docx", Visible: true);
            var headingsB = GetHeadingsInDocument(documentB);
            documentB.Close();

            // Open the target document (document C)
            var documentC = wordApplication.Documents.Open(@"C:\Users\MyUserName\Documents\documentC.docx", Visible: true);

            // Add a table to it (the traceability matrix)
            // The number of rows is the number of headings + one row reserved for a table header
            documentC.Tables.Add(documentC.Range(0, 0), headingsA.Count+1, 3);

            // Get the traceability matrix
            var traceabilityMatrix = documentC.Tables[1];

            // Add a table header and border
            AddTableHeaderAndBorder(traceabilityMatrix, "Headings from document A", "Headings from document B", "My Description");

            // Insert headings from doc A and doc B into doc C's traceability matrix
            for (var i = 0; i < headingsA.Count; i++)
            {
                // Insert headings from doc A
                var insertRangeColOne = traceabilityMatrix.Cell(i + 2, 1).Range;
                insertRangeColOne.Text = headingsA[i].Trim();

                // Insert headings from doc B
                var insertRangeColTwo = traceabilityMatrix.Cell(i + 2, 2).Range;
                insertRangeColTwo.Text = headingsB[i].Trim();
            }

            documentC.Save();
            documentC.Close();

            wordApplication.Quit();
        }

        // Based on:
        // -> http://csharpfeeds.com/post/5048/Csharp_and_Word_Interop_Part_4_-_Tables.aspx
        // -> http://stackoverflow.com/a/1817041/700926
        private static void AddTableHeaderAndBorder(Table table, params string[] columnTitles)
        {
            const int headerRowIndex = 1;

            for (var i = 0; i < columnTitles.Length; i++)
            {
                var tableHeaderRange = table.Cell(headerRowIndex, i+1).Range;
                tableHeaderRange.Text = columnTitles[i];
                tableHeaderRange.Font.Bold = 1;
                tableHeaderRange.Font.Italic = 1;
            }

            // Repeat header on each page
            table.Rows[headerRowIndex].HeadingFormat = -1;

            // Enable borders
            table.Borders.Enable = 1;
        }

        // Based on:
        // -> http://stackoverflow.com/q/7084270/700926
        // -> http://stackoverflow.com/a/7084442/700926
        private static List<string> GetHeadingsInDocument(Document document)
        {
            object headingsAtmp = document.GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);
            return ((Array)(headingsAtmp)).Cast<string>().ToList();
        }
    }
}

基本的に、コードは最初に 2 つの指定されたドキュメントからすべての見出しを読み込み、それらをメモリに格納します。次に、ターゲット ドキュメントを開き、トレーサビリティ マトリックスを作成してスタイルを設定し、最後にマトリックスに見出しを挿入します。

このコードは、次の前提に基づいています。

  • 対象文書(documentC.docx)が存在します。
  • 2 つの入力ドキュメント (documentA.docx と documentB.docx) の見出しの数には、同じ量の見出しが含まれています。この仮定は、デカルト積が不要であるというコメントに基づいています。

これがあなたの要件を満たしていることを願っています:)

于 2012-10-23T18:44:39.347 に答える