Office開発系です。
まずこちら。テーマはOpenXMLです。
.NETラボ様にお邪魔してお話します。
http://dn-lab.net/tabid/104/Default.aspx
日時:2009年7月18日(土) 13:30~17:00
会場:マイクロソ新宿本社オフィス 5F セミナールームB
会費:無料
「アラウンドOpenXML ~一体何がOpenなのか?~」
OpenXMLはマイクロソフト発祥のフォーマットですが、決して独りよがりではありません、
このセッションではOpenXMLを巡る様々なとりくみを紹介しながら、その相互互換性の高さを考えてみたいと思います
次にこちら。
こちらは、クリエの小山さんと共同で登壇します。
日時:2009年7月31日 13:00 - 2009年7月31日 18:40
会場:マイクロソフト株式会社 新宿本社
会費:無料
「Visual Studioを使った基幹システムにおけるOfficeソリューション開発」http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032420553&Culture=ja-JP
正直TechEdスライドの締切が7月中なのですが、う~ん、がんばらないと・・・
前回、前々回に引き続きOpen XML Format SDK 2.0(CTP)です。
Open XML Format SDK 2.0(Aplil 2009 CTP)http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&DisplayLang=en
今回は、DocumentReflectorから出力されたコードを用いてドキュメントを作成してみましょう。
1) 前回のおさらいですが、(これは事件だ.docx)をDocumentReflectorで開いて・・・
2) 最上位のPackageを選択してソースコードとして保存します(Demo.csと名づけてみました。)
3) Visual Studio 2008でコンソールアプリケーションを作成します。
4) 参照の設定から、WindowsBaseとOpen XML Format SDK で提供されるライブラリ(C:\Program Files\Open XML Format SDK\V2.0\lib\DocumentFormat.OpenXml.dll)
を選択します。
5) 既存の項目の追加より、上記で作成したDemo.csを追加します。
6) 下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
GeneratedCode.GeneratedClass gc = new GeneratedCode.GeneratedClass();
gc.CreatePackage(@"c:\これは事件だ.docx");
}
}
}
7) 実行すると、指定した場所にこれは事件だ.docxが出来上がっているはずです。
如何でしょうか?ExcelやPowerPointでも、あるいは、たとえVBAマクロが含まれていても、ドキュメントの作成は同じ手順で可能です。出力されたファイルを改変すれば、データベースから取得した値をあてはめることも簡単にできそうですので、応用範囲も広いと思われます。もっとも、これで帳票を作成したいと考える場合は、そもそもの帳票のファイルはOfficeドキュメントとしてテンプレート的に持ちたいはずです。そうした場合は、2) 最上位のPackageを選択して、ではなく作成するべきパーツを選択して、その部分をコード化すればよさそうですね。
あまり意味はないかもしれませんが、今回のプロジェクトをあげておきます。
(そしてこれは事件だ.docxを作ってみてください。)
前回に引き続き、Open XML Format SDK 2.0(CTP)です。
Open XML Format SDK 2.0(Aplil 2009 CTP)http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&DisplayLang=en
今回は新たに追加されたツールについて書きたいと思います。
2.0では新たに3つのツールが追加されました。
まずはコレです。
OpenXmlClassesExplorer
Ecma376で定義されているスキーマと、それに対応するOpenXMLSDKのクラスを一度に確認できるツールです。
次にこちら。
OpenXmlDiff
2つのファイルの比較ツールです。OpenXMLを使用したプログラミングを行うと、さまざまなアプローチでファイルの作成できることや、あるファイルをテンプレートとして、別のファイルを作成するときなど、比較したい場面は割りと発生するはずです。
最後にコレなのですが、非常に便利なツールです。
DocumentReflector
Office2007ドキュメント(Word、Excel、PowerPoint)を読み込ませると、そのファイルを生成するためのOpenXMLSDKコードを出力します。
例えばこのファイル(これは事件だ.docx)をDocumentReflectorで開くと・・・
画像もシリアル化されていますね・・・
最上位のPackageを選択してソースコードとして保存します(Demo.csと名づけてみました。)

ここまで読んだ皆様ならご理解いただけると思いますが、上記のコードから、[これは事件だ.docx]が生成できます。
そのためのVisualStudio2008プロジェクトを作ってみたいと思いますが・・・
ちょっと長くなったので、また次回にします。(本日中に書きたいと思います。)
少々時間も立っているのですが、ようやくお話できるようになりました。
Open XML Format SDK 2.0(Aplil 2009 CTP)http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&DisplayLang=en
SDK1.0との違いを中心に書きたいと思います。
まずはコレです。
Strongly Typed Classes and Objects
まず1.0のコーディングスタイルを見てみましょう。
const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; XNamespace w = wordmlNamespace; WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\aaa.docx", true); MainDocumentPart mainPart = wordDoc.MainDocumentPart; XDocument doc = XDocument.Load(new System.IO.StreamReader(mainPart.GetStream())); var query = from para in doc .Root .Element(w + "body") .Descendants(w + "p") from t in para.Descendants(w + "t") select t; foreach (var q in query) { Console.WriteLine(q.Value); } wordDoc.Close(); |
特にLINQ to XMLの部分に注目してください。
var query = from para in doc
.Root
.Element(w + "body")
.Descendants(w + "p")
from t in para.Descendants(w + "t")
select t;
XParh軸としてDescendants(子孫要素を返す)が使用されているのが分かるとおり、あくまでも汎用的なXMLを扱うコードと全く変わりありません。
コレが2.0になると以下のようなスタイルが可能です。
| WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\aaa.docx", false); var query = from para in wordDoc .MainDocumentPart .Document .Body .Elements<Paragraph>() from t in para.Elements() select t; foreach (var q in query) { Console.WriteLine(q.InnerText); } wordDoc.Close(); |
まず、「みじかっ」が初めの印象ですよね。
XML名前空間の指定をしていないためなんですが、その根本を確認するために、LINQ to XML部分を見てみると・・・
var query = from para in wordDoc
.MainDocumentPart
.Document
.Body
.Elements<Paragraph>()
from t in para.Elements()
select t;
おぉ、型付けされたクラスが使用されてるのが分かります。
このDOMと仲良しになったのが、大きな変更点です。コードは短くなるし、intellisenceは使えるし、ますますLINQに馴染んだとも言い換えることが出来るでしょう。
さて次に、Validationを見てみましょう。
Wordのdocxを作成してテーブルを追加します。
その中に文字列を入れ込みますが、果たしてこのコードで正しいXMLになってるでしょうか?
| WordprocessingDocument wordDoc = WordprocessingDocument.Create(@"c:\bbb.docx", WordprocessingDocumentType.Document); MainDocumentPart mainPart = wordDoc.AddMainDocumentPart(); mainPart.Document = new Document(); Body body = new Body(); mainPart.Document.Body = body; Table table = new Table(); table.Append(new TableProperties()); //table.Append(new TableGrid()); //ここが実行されないと、このXMLはInValidになるはず table.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text("こんにちは")))))); body.Append(table); wordDoc.MainDocumentPart.Document.Save(); OpenXmlValidator validator = new OpenXmlValidator(); var errors = validator.Validate((wordDoc)); foreach (ValidationErrorInfo error in errors) { Console.WriteLine(error.Description); } wordDoc.Close(); |
実行すると、コンソールに以下のようなエラーが表示されます。コメントにした部分が間違っていることが分かります。
OpenXMLはコードで生成することも可能ですから、こうしたチェックを利用するのは一つ手ですよね。
次にツールを紹介したいのですが、長くなってきましたので、次回にしたいと思います。
下記の本の執筆に協力しました。
(発売予定は2009年8月ですが、現在予約ができるようになっています。)
.NET 開発テクノロジ入門~.NETの基礎からクラウドテクノロジ Windows Azureまで
マイクロソフト(株) エバンジェリストチーム 著
日経BPソフトプレス 発行
2009年8月
3,990円(税込み)
最近のテクノロジーは本当に幅広く、種類も多く、矢継ぎ早に出てくるため、全体を通してキャッチアップすることが非常に難しくなってきています。
これは、私のように、以前からITを生業にしている人間にとってもなのですが、特にこれから学習を始める人にとっては、はたして全体がどうなっているのか?何から手をつけるべきなのか?なぜ似たような技術がたくさんある(ように見えるのか?)と思っている方も多くいるのではないでしょうか?
まさに太平洋ひとりぼっち状態です。
そうした方の指針となるべく書籍を企画したのが、我が師匠松崎です。
そして、師匠の元に集うエバンジェリストチーム(松崎、川西、井上(章)、井上(大)、鈴木、中原、小高)が結成され、執筆にあたりました。
キーワードは体系だった情報です。
WPFとWindowsForm
ASP.NET、AJAX、MVC、DynamicData
ADO.NET、LINQ、EntityFramework、DataServices
WCF、WF、Azure・・・
こうした技術の背景や使用シナリオなど、集中的に理解できる情報になっています。
そして、出版社である日経BP様のサイトには、書籍の一部を抜粋したコラムもスタートしています。http://itpro.nikkeibp.co.jp/article/COLUMN/20090618/332108/?ST=develop
こちらで、雰囲気を味わいつつ、書籍に触れていただけると幸いです。
タイトルのサイトの更新いたしました。
http://msdn.microsoft.com/ja-jp/data/default.aspx
今回は概要ページにコンテンツを追加しています。
まず、これです。
「マイクロソフトのデータ アクセス技術の変移」(対談記事)
この記事は、エバンジェリストの野村一行、コンサルタントとして活動している赤間信幸 (赤間本の赤間さんです)、そして、株式会社アークウェイから奥田直人氏をお招きして色々お話してもらいました。(奥田さんの詳細はこちらで:アーキテクチャーの大切さを伝えていきたい)
読んでいただくと分かりますが、相当濃いメンバーです。
実際は、こんなにきれいに対談できたわけもなく、みんなが瞑々にあの話題、この話題、となりまして、記事化するのに大変苦労しました(笑)
次にこちらです。
データ アクセスの 達人に聞く (対談ビデオ)
#01 - ADO.NET とは?
#02 - LINQ とは?
#03 - ADO.NET Entity Framework とは?
#04 - ADO.NET Data Services とは?
こちらは、おなじみ太田と小高の2人がインタビュアーになって、色々な達人に聞きにいくという企画ビデオです。といいながら、お互いがインタビューし合うという、わけの分からない状況も生まれています(笑)
後はトップページがごちゃごちゃしていたのでスッキリ整理しました。
こちらのページをずっと手がけていたので、なんだか愛着がわいてきましたね。
皆様是非今後ともごひいきに。
ReMIXというイベントをご存じでしょうか?
マイクロソフトが主催するWeb、UX系のイベントです。
http://www.microsoft.com/japan/events/remix/2009/default.aspx
開催日時 2009 年 7 月 16 日 (木) 10:00 ~ 19:00
会場 東京ミッドタウン ホール A・B
ぶっちゃけて言うとSilverlight、Blend、Azureに興味がある方集まれ~という感じのイベントですが、このイベントの優待がProjectUX上から申し込むことが可能になっています。
ProjectUX
http://www.microsoft.com/japan/powerpro/projectux/default.mspx
こちらが、その優待です。

ご興味のある方、ぜひ上記リンクから申し込んでみてください。(締切近し!)
一応私もヘルプ要員で参加すると思います。
----------------
ちなみに、ブレイクアウトセッションは、個人的にコレが気になりますね~
C-2 : Silverlight 3 と ASP.NET、Windows Azure でつくるデータ駆動アプリケーションhttp://www.microsoft.com/japan/events/remix/2009/conference_c2.aspx
.NET RIA ServicesはTechEdで小高も話をしたいな~と思っていたりいなかったり。
すでに松崎も書いているように、クリエイルミネート様が無償セミナーを企画しています。
Office と XML Web サービスによるクラウド型アプリケーションの実現
http://www.crie-illuminate.jp/training/courselistall.aspx?id=EXS001
株式会社ジョルダン様の乗換案内 XML Web サービスを取り上げ、なおかつ、Officeをフロントに使用したシステム開発を行うセミナーです。
ジョルダン様の乗換案内は非常に著名なのですが、以前松崎と私でインタビューを行い、パイオニアとしての苦労など、ジョルダン様だからこその言葉を記事にしていますので、そちらもご覧いただけると幸いです。
クラウドの先輩企業から学ぶ教訓 (その魅力と現実)
また、このセミナーの講師は、VSTOとSharePoint Server 2007 による開発技術 を一緒に執筆した小山さんです。
実は小山さんにもインタビューを行い記事にしています。講師がどのような人でどういった考えを持っているかは、この記事をご覧ください。(私の師匠に当たる方です)
Microsoft Office は空気とか水のような当たり前のもの
利便性の高いOfficeクライアント+利便性の高い乗換案内Webサービスの組み合わせは、私も実は実装の経験があります。非常に魅力的なソリューションが構築できるはずですので、ご興味のある方ぜひご確認ください。
今回は主にタスクバーについての開発情報です。
http://www.microsoft.com/japan/powerpro/TF/column/tk_11_1.mspx
次回は大野からSDKの紹介です。
【Windows 7 コラムシリーズ 全 5 回】
- 第 1 回 開発者のための Windows 7 ~まずはここから~
- 第 2 回 新しいユーザーインターフェイス
- 第 3 回 Windows SDK for Windows 7のご紹介 (大野元久 / 6 月 4 日公開予定)
- 第 4 回 アプリケーションの互換性 (松崎剛、大野元久 / 6 月 18 日公開予定)
- 第 5 回 その他 (長沢智治 / 6 月 25 日公開予定)
このところ、書籍の執筆とWindows7でなかなか手に付かなかったのですが、実は次期Visual StudioのBetaがリリースされてます。
Visual Studio 2010 and .NET Framework 4 Beta 1(英語)
http://msdn.microsoft.com/ja-jp/vstudio/dd582936(en-us).aspx
Microsoft Visual Studio 2010 - 将来のバージョン(日本語)http://www.microsoft.com/japan/msdn/vstudio/2010/
で気がつくと、ADO.NETチームブログにたくさんのエントリが!(こればかりですね・・・)
例えばこれです。
http://blogs.msdn.com/adonet/archive/2009/05/21/updated-entity-framework-documentation-for-beta1.aspx
ADO.NET EntityFrameworkは、次期バージョンでかなり改良されています。
例えば、上記のエントリに書いてあることを書き出してみます。
・Persistence-Ignorant Objects
いわゆるPIシナリオのサポートですね。永続化層に対して特定インタフェイスや特定プロダクトの実装をエンティティにいれこまないことが可能です。システムの汎用化を促進します。で、当然POCOを使用します。ちなみに現状実装ではInterface+POCOにせざる得ないんですよ。(このへんはプログラミングLINQにも記述しています。)
・Deferred Loading of Related Objects
遅延ロードの実装です。LINQ to SQLではありましたが、EFにはなかったものです。
ただ、欲しい人とそうでない人にわかれる機能ですね。コレ。
・Functions in LINQ to Entities Queries
CLRのメソッドがCSDL/SSDL上に定義できるようになります。でLINQ to Entities越しに実行可能と。
ドメインモデルをどこまでメタボにするのか?は意見の分かれるところだと思いますが。
・Customized Object Layer Code Generation
これは大きいですね、要するにEDMの独自改修をサポートしてくれる機能です。
今までユーザーが個人で追加したインターフェイスなどのサポートは不可能でした。(ツールでジェネレートするしかなかったわけです。)
T4Templarte機能を使用してテンプレートに従ってクラスをジェネレートします。必要な部分は開発者が手を入れた形でクラスが作られます。
ここが詳しいです。
Customizing Entity Classes in VS 2010
http://blogs.msdn.com/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx
T4Templateについては以下より。
How Do I: Create And Use T4 Templates?
http://msdn.microsoft.com/en-us/vstudio/cc308634.aspx
ただ、上にも書きましたが、ドメインモデルにどのくらい機能をもたせるのか?は意見の分かれるところなんですよね。でもできた方がよいにきまっています。
・Model-First Support
これも正常進化系、概念モデルより、データベースのモデルを作成する形が可能になります。
スクリプトが発行可能なんですね。使用するかは置いておいて。
・Complex Type Support in the Entity Data Model Designer
正常進化ですね。デザイナでより複雑な型がサポートされます。これは使うこともあるでしょう。
・Naming Service
これはまぁ微妙かな~
単数形とか複数形とかEntityの名前の自動化あたりです。
・Improved Model Browser Functionality
Entityの検索とか、オブジェクトの削除とか。
・User-Defined Functions (Entity SQL)
EntitySQLでユーザー定義関数のコールがサポートされます。LINQ to Entitiesではどうなんでしょう?(これは後ほど確認したいと思います。)
という感じがEFの次期バージョンです。どうですか?正常進化していると思いました?
本音を言うと、早くこれとか、DataServicesとかRIAServisesとかとか評価したいのですが、状況が許さないところだったりします。
EFについては、井上ブログも取り扱っていますので、そちらもご確認を。
TechFieldersでも Windows 7情報をコラムとしてご提供し始めたように、徐序にWindows7情報が増えています。
MSDN Windowsデベロッパーセンターにも、本日互換性情報がアップされました。
Windows 7 互換性情報
http://msdn.microsoft.com/ja-jp/windows/dd819177.aspx
中をみると、各種ホワイトペーパーと、HandsOnLaboなど存在しています。また、Application Compatibility Toolkit(ACT):互換性と検証用のツールのホワイトペーパーも翻訳されているのもうれしいのですが、ただApplication Verifier:アプリケーションのお作法チェックツール、が欠けているのが残念なところ。
Application Verifierについてはこの辺りから(英語)
http://msdn.microsoft.com/en-us/library/dd371695(VS.85).aspx
実システム開発を行っている方にとっては、Windows7の新機能よりも、まず互換性が気になるところではないでしょうか。
ご興味のある方ぜひご確認ください。
同僚のエバンジェリスト井上大輔にWindows 7 のマルチタッチのデモを行ってもらいました。
通常イベントなどでこうしたデモは、専用のPCが必要になるので紹介しにくいので、ビデオ化してみました。(画像が荒いのはご了承ください。)
Silverlight Sreamにアップしたかったのですが、どうもうまくいかないので、Soapboxを使用しています。
Video: マルチタッチデモ
現在タッチでプログラムを行うには、ネイティブAPIを使用しなければなりませんが、マネージで行う場合は、以下などが参考になると思います。
http://windowsteamblog.com/blogs/developers/archive/2009/03/30/windows-7-net-interop-sample-libraries.aspx
こちらのエントリはWPFからP/Invokeしています。面白いですね。
http://blog.andreweichacker.com/2009/02/windows-7-multi-touch-using-wpf/
タッチに興味が出た方は、是非以下のホワイトペーパーも参考にしてください。
テックフィールダーズに「開発者のためのWindows7」シリーズがスタートしました。
まずは第1回目ということで、まずはここから、という概要をご紹介しています。
http://www.microsoft.com/japan/powerpro/TF/column/tk_10_1.mspx
ページ数も限られていますので、概要といってもホンのポインタなのですが、忙しい開発者の皆様にとって、「細かいことはいいんだよ」と思う方もいると思います。そうした人にとってはザックリと情報収集できる記事になっているはずです。
なお、このコラムは下記にある全5回のシリーズの予定です
【Windows 7 コラムシリーズ 全 5 回】
- 第 1 回 開発者のための Windows 7 ~まずはここから~
- 第 2 回 新しいユーザーインターフェイス (小高太郎 / 5 月 28 日 公開予定)
- 第 3 回 Windows SDK for Windows 7のご紹介 (大野元久 / 6 月 4 日公開予定)
- 第 4 回 アプリケーションの互換性 (松崎剛、大野元久 / 6 月 18 日公開予定)
- 第 5 回 その他 (長沢智治 / 6 月 25 日公開予定)
次回はUI周りでタスクバーをとりあげる予定です。
Windows7のタスクバーは、使い勝手がよくて便利ですよ。
非常に申し訳ありませんが、新型インフルエンザ対応のため、6月まで予定されていたTFセミナーを全て中止しなければならなくなりました。
小高の場合、5/27の中部支店でWindows7のミニセッションを行うはずだったのですが、これも残念ながら中止です。
ライトニングトークの応募があった方、セミナーに申し込まれた方、大変申し訳ありませんが、ご了承いただければと思います。