Word のドキュメントレベル開発における Custom XML の追加と表示

[今日のみちしるべ 第16回 やっぱ C# なんですかね。]

みちしるべブログのアクセスビューを分析するとどうやら、C# のサンプルのほうがアクセスが多いのに気が付きます。

例えば、Tech-ED でお見せした Word の発注書なんかですが、VB版のほうが古くから公開しているのにも関わらず、C# 版のアクセスビューのほうが多いです。

確かにメモリの使い方とか、引数の省略とか明示的だなあとは思うのですが、Office 開発はしきいの低さが売りなので、個人的に C# は違和感を感じます。(でも、C# 自体は好きですよ。)

確かに VBA・マクロから入る人は VB かもしれませんが、.NET 開発から入る人は C# が親しみやすいでしょうね。

僕自身は元々開発者ではないので、実はどちらでもいいんです。(笑)

ただ、.NET には VB から入ったことと、VBA・マクロ開発者をターゲットとしていたので、サンプル自体は VB が多いのですが、アクセスビューの分析から、C# メインでサンプルを考えたほうがいいのかもしれません。

近々、Tech-ED の最初で公開した以下も C# にしてみたいと思います。

Tech-ED で最初に見せた発注書デモの公開

[本題]

今回は Word のドキュメントレベル開発における Custom XML の追加と表示についてご紹介したいと思います。

Open XML 開発もいろいろと手法はあるのですが、

外部の XML データをそのまま取り込んで、ドキュメントに表示する手法はよく使われる開発手法かと思われます。

今回は Custom XML パーツの作成と XML データの取り込み、そして、ドキュメント上への表示を実装する方法についてご紹介したいと思います。

流れ的には以下です。

1. プログラム的に XML データを作成

2. XML ファイルを Custom XML パーツとして、Open XML ファイルに組み込む

3. ドキュメント上に表示

続いて図で手順を表してみたいと思います。

1.実行前

image

2.実行前のドキュメントの構造

image

※Custom XML フォルダは存在しません。

3.実行後

image 

※ドキュメント上に配置したコンテンツコントロールにデータが表示されます。

4.実行後のドキュメントの構造

image

※ Custom XML フォルダが生成されています。

5.Custom XML フォルダの中身

image 

※Custom XML フォルダ内に item2.xml が作成されています。

開いてみると以下の XML データが保存されています。

image 

※Custom XML パーツの概念などについては以下の情報をご確認ください。

Open XML SDK Version 2 (Community Technical Preview(CTP) )がリリースされています。

カスタム XML 部分の概要
https://msdn.microsoft.com/ja-jp/library/bb608618.aspx

C# 版のサンプルは以下になります。

private void button1_Click(object sender, EventArgs e)
{

// XML データの生成です。単純に String 型として、XML データを生成しています。

   string xmlString =
"<?xml version=\"1.0\"?>" + "<Customer>" +
"<CompanyName>マイクロソフト株式会社</CompanyName>" +
"<ContactName>小山 才喜</ContactName>" +
"<ContactTitle>Office プリセールスエンジニア</ContactTitle>" +
"<Phone>00-7654321</Phone>" +
"</Customer>";

//Open XML ファイルに Custom XML パーツ(フォルダ)を生成します。

// 上記の XML データをファイルとして、Custom XML パーツに XML ファイルを生成します。

            Office.CustomXMLPart employeeXMLPart = this.CustomXMLParts.Add(xmlString, new Office.CustomXMLSchemaCollectionClass());

// ドキュメントに実装している各コンテンツコントロールに XML のデータをマッピングしていきます。

            string strXPath1;
strXPath1 = "/Customer/CompanyName";
plainTextContentControl1.XMLMapping.SetMapping(strXPath1,"",employeeXMLPart);

string strXPath2;
strXPath2 = "/Customer/ContactName";
plainTextContentControl2.XMLMapping.SetMapping(strXPath2, "", employeeXMLPart);

            string strXPath3;
strXPath3 = "/Customer/ContactTitle";
plainTextContentControl3.XMLMapping.SetMapping(strXPath3, "", employeeXMLPart);

            string strXPath4;
strXPath4 = "/Customer/Phone";
plainTextContentControl4.XMLMapping.SetMapping(strXPath4, "", employeeXMLPart);

        }

VB版は以下になります。

Dim xmlString As String = _

"<?xml version=""1.0""?>" & "<Customer>" & _
"<CompanyName>Alfreds Futterkiste</CompanyName>" & _
"<ContactName>Maria Anders</ContactName>" & _
"<ContactTitle>Sales Representative</ContactTitle>" & _
"<Phone>030-0074321</Phone>" & _
"</Customer>"
Me.CustomXMLParts.Add(xmlString)

Dim strXPath1 As String
strXPath1 = "/Customer/CompanyName"
Me.plainTextContentControl1.XMLMapping.SetMapping(strXPath1)

Dim strXPath2 As String
strXPath2 = "/Customer/ContactName"
Me.plainTextContentControl2.XMLMapping.SetMapping(strXPath2)

Dim strXPath3 As String
strXPath3 = "/Customer/ContactTitle"
Me.plainTextContentControl3.XMLMapping.SetMapping(strXPath3)

Dim strXPath4 As String
strXPath4 = "/Customer/Phone"
Me.plainTextContentControl4.XMLMapping.SetMapping(strXPath4)

実際の Open XML 開発に関しては上記のロジックを応用するパターンが多くつかわれるようです。

今後は業務で使える応用パターンについて、ご紹介していきたいと思います。