次の方法で共有


方法 : Microsoft Office を起動せずにカスタム XML 部分を文書に追加する

更新 : 2007 年 11 月

対象

このトピックの情報は、指定された Microsoft Office のバージョンにのみ適用されます。

Microsoft Office のバージョン

  • Excel 2007

  • PowerPoint 2007

  • Word 2007

詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

Microsoft Office Excel、Microsoft Office PowerPoint、または Microsoft Office Word を起動せずに、カスタム XML 部分を文書に追加することができます。これは、サーバーなど、Microsoft Office がインストールされていないコンピュータ上の文書に XML データを保存する場合に役立ちます。詳細については、「カスタム XML 部分の概要」を参照してください。

カスタム XML 部分を追加する文書は、.docx、.xlsx、.pptx などのオープン XML 形式のファイルであることが必要です。バイナリ ファイル形式のカスタム XML 部分には、Microsoft Office アプリケーションを起動せずにアクセスすることはできません。

Microsoft Office を起動せずにカスタム XML 部分を追加するには、Package クラスと PackagePart クラスを使用します。これらのクラスの詳細については、「Windows Presentation Foundation のドキュメント」を参照してください。

Microsoft Office を起動せずにカスタム XML 部分を文書に追加するには

  1. カスタム XML 部分に追加する XML を表す XmlDocument オブジェクトを作成します。

    Dim xmlString As String = _
        "<?xml version=""1.0"" encoding=""utf-8"" ?>" & _
            "<employees https://schemas.microsoft.com/vsto/samples"">" & _
                "<employee>" & _
                    "<name>Karina Leal</name>" & _
                    "<hireDate>1999-04-01</hireDate>" & _
                    "<title>Manager</title>" & _
                "</employee>" & _
            "</employees>"
    
    Dim reader As StringReader = New StringReader(xmlString)
    Dim xmlDoc As XmlDocument = New XmlDocument()
    xmlDoc.Load(reader)
    
    string xmlString =
        "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
        "<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" +
            "<employee>" +
                "<name>Karina Leal</name>" +
                "<hireDate>1999-04-01</hireDate>" +
                "<title>Manager</title>" +
            "</employee>" +
        "</employees>";
    
    StringReader reader = new StringReader(xmlString);
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(reader);
    
  2. 文書に追加するカスタム XML 部分を表す PackagePart を作成します。前の手順で作成した XmlDocument オブジェクト内の XML を新しいカスタム XML 部分に保存します。

    Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _
        FileAccess.ReadWrite)
        Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative)
        If Not package.PartExists(uriPartTarget) Then
            Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _
                "application/vnd.openxmlformats-officedocument.customXmlProperties+xml")
            Using partStream As Stream = customXml.GetStream(FileMode.Create, _
                FileAccess.ReadWrite)
                xmlDoc.Save(partStream)
            End Using
        End If
    End Using
    
    using (Package package = Package.Open(fullDocumentPath, FileMode.Open,
        FileAccess.ReadWrite))
    {
        Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative);
    
        if (!package.PartExists(uriPartTarget))
        {
            PackagePart customXml = package.CreatePart(uriPartTarget,
                "application/vnd.openxmlformats-officedocument.customXmlProperties+xml");
    
            using (Stream partStream = customXml.GetStream(FileMode.Create,
                FileAccess.ReadWrite))
            {
                xmlDoc.Save(partStream);
            }
        }
    }
    

使用例

%UserProfile%\My Documents フォルダ (Windows XP およびそれ以前の Windows バージョンの場合) または %UserProfile%\Documents フォルダ (Windows Vista の場合) にある Employees.docx という Word 文書にカスタム XML 部分を追加するコード例を次に示します。

このコード例はコンソール アプリケーションでの使用を前提としていますが、Windows Presentation Foundation (WPF) アプリケーションなど、.NET Framework 3.0 以降に対応するアプリケーションで使用できるように変更することもできます。

このコード例を Excel や PowerPoint の文書で使用できるように変更するには、Main メソッドに対し、その文書の完全パスを AddCustomXmlPart メソッドに渡すように変更を加えます。

Sub Main()
    AddCustomXmlPart(Environment.GetFolderPath( _
        Environment.SpecialFolder.MyDocuments) & "\Employees.docx")
End Sub

Private Sub AddCustomXmlPart(ByVal fullDocumentPath As String)
    Dim xmlDoc As XmlDocument = GetXmlDocumentFromString()

    If xmlDoc IsNot Nothing Then
        Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _
            FileAccess.ReadWrite)
            Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative)
            If Not package.PartExists(uriPartTarget) Then
                Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _
                    "application/vnd.openxmlformats-officedocument.customXmlProperties+xml")
                Using partStream As Stream = customXml.GetStream(FileMode.Create, _
                    FileAccess.ReadWrite)
                    xmlDoc.Save(partStream)
                End Using
            End If
        End Using
    End If
End Sub

Private Function GetXmlDocumentFromString() As XmlDocument
    Dim xmlString As String = _
        "<?xml version=""1.0"" encoding=""utf-8"" ?>" & _
            "<employees https://schemas.microsoft.com/vsto/samples"">" & _
                "<employee>" & _
                    "<name>Karina Leal</name>" & _
                    "<hireDate>1999-04-01</hireDate>" & _
                    "<title>Manager</title>" & _
                "</employee>" & _
            "</employees>"

    Dim reader As StringReader = New StringReader(xmlString)
    Dim xmlDoc As XmlDocument = New XmlDocument()
    xmlDoc.Load(reader)
    Return xmlDoc
End Function
static void Main(string[] args)
{
    AddCustomXmlPart(Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments) + @"\Employees.docx");
}

private static void AddCustomXmlPart(string fullDocumentPath)
{
    XmlDocument xmlDoc = GetXmlDocumentFromString();

    if (xmlDoc != null)
    {
        using (Package package = Package.Open(fullDocumentPath, FileMode.Open,
            FileAccess.ReadWrite))
        {
            Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative);

            if (!package.PartExists(uriPartTarget))
            {
                PackagePart customXml = package.CreatePart(uriPartTarget,
                    "application/vnd.openxmlformats-officedocument.customXmlProperties+xml");

                using (Stream partStream = customXml.GetStream(FileMode.Create,
                    FileAccess.ReadWrite))
                {
                    xmlDoc.Save(partStream);
                }
            }
        }
    }
}

private static XmlDocument GetXmlDocumentFromString()
{
    string xmlString =
        "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
        "<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" +
            "<employee>" +
                "<name>Karina Leal</name>" +
                "<hireDate>1999-04-01</hireDate>" +
                "<title>Manager</title>" +
            "</employee>" +
        "</employees>";

    StringReader reader = new StringReader(xmlString);
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(reader);
    return xmlDoc;
}

コードのコンパイル方法

  • このコード例には WindowsBase.dll アセンブリへの参照が必要ですこのアセンブリは .NET Framework Version 3.0 以降に含まれています。

  • このコード例には、次の名前空間を指定する using ステートメント (C# の場合) または Imports ステートメント (Visual Basic の場合) が必要です。

    • System.IO

    • System.IO.Packaging

    • System.Xml

参照

処理手順

方法 : ドキュメント レベルのカスタマイズにカスタム XML 部分を追加する

方法 : アプリケーション レベルのアドインを使用してドキュメントにカスタム XML 部分を追加する

概念

カスタム XML 部分の概要