[方法] ワープロ ドキュメントのヘッダーを置換する (Open XML SDK)How to: Replace the header in a word processing document (Open XML SDK)

このトピックでは、Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメント内のヘッダーを置換する方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 for Office to replace the header in word processing document programmatically.

このトピックのサンプル コードを使用するには、Open XML SDK 2.5 (英語) をインストールする必要があります。プロジェクトで次のアセンブリを明示的に参照する必要があります。To use the sample code in this topic, you must install the Open XML SDK 2.5. You must explicitly reference the following assemblies in your project:

  • WindowsBaseWindowsBase

  • DocumentFormat.OpenXml (Open XML SDK によってインストールされます)DocumentFormat.OpenXml (installed by the Open XML SDK)

このトピックのコードをコンパイルするには、次の using ディレクティブまたは Imports ステートメントも使用する必要があります。You must also use the following using directives or Imports statements to compile the code in this topic.

    using System.Collections.Generic;
    using System.Linq;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    Imports System.Collections.Generic
    Imports System.Linq
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Wordprocessing

ヘッダー参照要素の構造Structure of the Header Reference Element

この例では、対象のファイルからヘッダー パーツを削除して、別のヘッダー パーツを作成します。また、既存のヘッダーへの参照も削除して、新しいヘッダーへの参照を作成します。したがって、ヘッダーおよびヘッダー参照要素に関する理解を深めておくことが役立ちます。ISO/IEC 29500 (英語) の仕様に記載されている次の情報に、ヘッダー参照要素が紹介されています。In this example you are going to delete the header part from the target file and create another header part. You are also going to delete the reference to the existing header and create a reference to the new header. Therefore it is useful to familarize yourself with headers and the header reference element. The following information from the ISO/IEC 29500 specification introduces the header reference element.

headerReference (ヘッダー参照)headerReference (Header Reference)

この要素はドキュメント内の現在のセクションに関連付けられる単一のヘッダーを指定します。このヘッダーは id 属性を介して参照されます。id 属性は、WordprocessingML パッケージの該当するヘッダー パーツへの明示的なリレーションシップを指定します。This element specifies a single header which shall be associated with the current section in the document. This header shall be referenced via the id attribute, which specifies an explicit relationship to the appropriate Header part in the WordprocessingML package.

この要素で指定されたリレーションシップの種類が http://schemas.openxmlformats.org/officeDocument/2006/header ではない場合、存在しない場合、または TargetMode 属性の値が Internal ではない場合は、ドキュメントは不適合と見なされます。If the relationship type of the relationship specified by this element is not http://schemas.openxmlformats.org/officeDocument/2006/header, is not present, or does not have a TargetMode attribute value of Internal, then the document shall be considered non-conformant.

ドキュメントの各セクションには、最大で次の 3 種類のヘッダーがある可能性があります。Within each section of a document there may be up to three different types of headers:

  • 先頭ページ ヘッダーFirst page header

  • 奇数ページ ヘッダーOdd page header

  • 偶数ページ ヘッダーEven page header

現在の headerReference によって指定されるヘッダーの種類は、 type 属性を介して指定されます。The header type specified by the current headerReference is specified via the type attribute.

特定のセクションでいずれかの種類のヘッダーが省略された場合は、以下の規則が適用されます。If any type of header is omitted for a given section, then the following rules shall apply.

  • 先頭ページ ヘッダーの headerReference が指定されておらず、 titlePg 要素が指定されている場合は、前のセクションから先頭ページ ヘッダーが継承されます。ドキュメントの最初のセクションである場合は、新しい空のヘッダーが作成されます。 titlePg 要素が指定されていない場合は、先頭ページ ヘッダーが表示されず、奇数ページ ヘッダーが代わりに使用されます。If no headerReference for the first page header is specified and the titlePg element is specified, then the first page header shall be inherited from the previous section or, if this is the first section in the document, a new blank header shall be created. If the titlePg element is not specified, then no first page header shall be shown, and the odd page header shall be used in its place.

  • 偶数ページ ヘッダーの headerReference が指定されておらず、 evenAndOddHeaders 要素が指定されている場合は、前のセクションから偶数ページ ヘッダーが継承されます。ドキュメントの最初のセクションである場合は、新しい空のヘッダーが作成されます。 evenAndOddHeaders 要素が指定されていない場合は、偶数ページ ヘッダーが表示されず、奇数ページ ヘッダーが代わりに使用されます。If no headerReference for the even page header is specified and the evenAndOddHeaders element is specified, then the even page header shall be inherited from the previous section or, if this is the first section in the document, a new blank header shall be created. If the evenAndOddHeaders element is not specified, then no even page header shall be shown, and the odd page header shall be used in its place.

  • 奇数ページ ヘッダーの headerReference が指定されていない場合は、前のセクションから偶数ページ ヘッダーが継承されます。ドキュメントの最初のセクションである場合は、新しい空のヘッダーが作成されます。If no headerReference for the odd page header is specified then the even page header shall be inherited from the previous section or, if this is the first section in the document, a new blank header shall be created.

: 次のように別々の先頭、奇数、および偶数ページ ヘッダーが定義された 3 ページのドキュメントがあるとします。Example: Consider a three page document with different first, odd, and even page header defined as follows:

異なるヘッダーが指定された 3 ページのドキュメント

このドキュメントでは、次のパッケージング マークアップに示すように、それぞれ固有のリレーションシップ ID を持つドキュメント パーツからのリレーションシップが設定された、3 つのヘッダーが定義されています。This document defines three headers, each of which has a relationship from the document part with a unique relationship ID, as shown in the following packaging markup:

    <Relationships xmlns=http://schemas.openxmlformats.org/package/2006/relationships>
      …
      <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml" />
      <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml" />
      <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml" />
      …
    </Relationships>

これらのリレーションシップは、次の WordprocessingML を使用して、セクションのプロパティで参照されます。These relationships are then referenced in the section's properties using the following WordprocessingML:

**

    <w:sectPr>  
      …  
      <w:headerReference r:id="rId3" w:type="first" />  
      <w:headerReference r:id="rId5" w:type="default" />  
      <w:headerReference r:id="rId2" w:type="even" />  
      …  
    </w:sectPr>  

生成されるセクションでは、リレーションシップ ID rId3 を持つヘッダー パーツが先頭ページに、リレーションシップ ID rId2 を持つヘッダー パーツがそれ以降のすべての偶数ページに、リレーションシップ ID rId5 を持つヘッダー パーツがそれ以降のすべての奇数ページに使用されます。 例の終了]The resulting section shall use the header part with relationship id **rId3 for the first page, the header part with relationship id rId2 for all subsequent even pages, and the header part with relationship id rId5 for all subsequent odd pages. end example]

© ISO/IEC29500: 2008.© ISO/IEC29500: 2008.

サンプル コードSample Code

以下のコード例は、ワープロ ドキュメント内のヘッダーを別のワープロ ドキュメントのヘッダーで置換する方法を示しています。 AddHeaderFromTo メソッドを呼び出すには、次の例のようなコードを使用します。The following code example shows how to replace the header in a word processing document with the header from another word processing document. To call the method, AddHeaderFromTo, you can use the following code segment as an example.

    string filepathFrom = @"C:\Users\Public\Documents\Word15a.docx";
    string filepathTo=@"C:\Users\Public\Documents\Word15b.docx";
    AddHeaderFromTo(filepathFrom,  filepathTo);
    Dim filepathFrom As String = "C:\Users\Public\Documents\word15a.docx"
    Dim filepathTo As String = "C:\Users\Public\Documents\Word15b.docx"
    AddHeaderFromTo(filepathFrom, filepathTo)

以下に、C# と Visual Basic による完全なサンプル コードを示します。Following is the complete sample code in both C# and Visual Basic.

    public static void AddHeaderFromTo(string filepathFrom, string filepathTo)
    {
        // Replace header in target document with header of source document.
        using (WordprocessingDocument 
            wdDoc = WordprocessingDocument.Open(filepathTo, true))
        {
            MainDocumentPart mainPart = wdDoc.MainDocumentPart;

            // Delete the existing header part.
            mainPart.DeleteParts(mainPart.HeaderParts);

            // Create a new header part.
            DocumentFormat.OpenXml.Packaging.HeaderPart headerPart = 
        mainPart.AddNewPart<HeaderPart>();

            // Get Id of the headerPart.
            string rId = mainPart.GetIdOfPart(headerPart);

            // Feed target headerPart with source headerPart.
            using (WordprocessingDocument wdDocSource = 
                WordprocessingDocument.Open(filepathFrom, true))
            {
                DocumentFormat.OpenXml.Packaging.HeaderPart firstHeader =
        wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

                    wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

                if (firstHeader != null)
                {
                    headerPart.FeedData(firstHeader.GetStream());
                }
            }

            // Get SectionProperties and Replace HeaderReference with new Id.
            IEnumerable<DocumentFormat.OpenXml.Wordprocessing.SectionProperties> sectPrs = 
        mainPart.Document.Body.Elements<SectionProperties>();
            foreach (var sectPr in sectPrs)
            {
                // Delete existing references to headers.
                sectPr.RemoveAllChildren<HeaderReference>();

                // Create the new header reference node.
                sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
            }    
        }
    }
    Public Sub AddHeaderFromTo(ByVal filepathFrom As String, ByVal filepathTo As String)
        ' Replace header in target document with header of source document.
        Using wdDoc As WordprocessingDocument = _
            WordprocessingDocument.Open(filepathTo, True)
            Dim mainPart As MainDocumentPart = wdDoc.MainDocumentPart

            ' Delete the existing header part.
            mainPart.DeleteParts(mainPart.HeaderParts)

            ' Create a new header part.
            Dim headerPart = mainPart.AddNewPart(Of HeaderPart)()

            ' Get Id of the headerPart.
            Dim rId As String = mainPart.GetIdOfPart(headerPart)

            ' Feed target headerPart with source headerPart.
            Using wdDocSource As WordprocessingDocument = _
                WordprocessingDocument.Open(filepathFrom, True)
                Dim firstHeader = wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault()

                If firstHeader IsNot Nothing Then
                    headerPart.FeedData(firstHeader.GetStream())
                End If
            End Using

            ' Get SectionProperties and Replace HeaderReference with new Id.
            Dim sectPrs = mainPart.Document.Body.Elements(Of SectionProperties)()
            For Each sectPr In sectPrs
                ' Delete existing references to headers.
                sectPr.RemoveAllChildren(Of HeaderReference)()

                ' Create the new header reference node.
                sectPr.PrependChild(Of HeaderReference)(New HeaderReference() With { .Id = rId })
            Next
        End Using
    End Sub

関連項目See also

その他のリソースOther resources

Open XML SDK 2.5 クラス ライブラリ リファレンスOpen XML SDK 2.5 class library reference