※ この情報はOffice 2013 カスタマー プレビュー版を元にしています。製品版では変更になる可能性がありますのでご注意ください。
これまでExcel 2013用作業ウィンドウのアプリをJavaScriptで作成する方法について記事を書いてきましたが(下記参照)、今回は下記記事を書くにあたって疑問に思ったことを一つずつ検証していこうと思います。
・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。
//www.ka-net.org/blog/?p=1995
・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。(2)
//www.ka-net.org/blog/?p=2022
・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。(3)
//www.ka-net.org/blog/?p=2050
■ アプリは全体に反映される?ドキュメント単位?
Office用アプリを挿入すると、挿入したアプリは全体に反映される(どのドキュメントを開いてもアプリが表示される)のか、個別のドキュメント単位で反映されるのかを調べてみました。
結果は上図の通りドキュメント単位で反映されるようです。
このことはアプリを挿入したドキュメントをZip解凍するとよく分かります。
アプリを挿入したドキュメントの場合、上図のようにxlフォルダの中に「webextensions」フォルダがあり、その中に作業ウィンドウアプリを定義したXMLファイルが格納されていることが確認できます。
ちなみに、アプリを挿入したファイルをアドイン(xlam形式)として登録した場合でも全体にアプリは反映されませんでした。(といっても”Office 用アプリのリスト“からすぐにアプリを挿入できるので、全体に反映させる必要はあまり無さそうですが…)
■ アプリ名や作成者名、説明には全角文字は使える?
アプリ名や作成者名、説明(カタログ用XMLファイルのProviderName要素、DisplayName要素、Description要素)に日本語(全角文字)が使えるかどうかを試してみました。
上図の通り、問題は無さそうです。
■ アニメーションGIFは使える?
imgタグを貼り付けて実際に確認してみましたが、上図の通り(上図では分かりづらいですが…)問題無く動きました。
■ Flash ムービーは再生できる?
embedタグやiframeタグで動画を埋め込んで確認してみましたが、「この Web サイトのアドオンは実行できませんでした。[インターネット オプション] のセキュリティ設定で、競合がないことを確認してください。」との警告が表示されて再生できませんでした。
Internet Explorerのセキュリティ設定を変更すれば再生できるかもしれませんが、ユーザー環境に依存するようでは汎用性は低いだろうと思います。
ちなみに、YouTubeの場合はHTML5 動画プレーヤーが有効になっている場合には警告が表示されませんでした。
■ HTML以外のファイルも動かせる?
カタログ用XMLファイルのSourceLocation要素でアプリの実態となるファイルを指定していますが、HTMLファイル以外でも動作するのか試してみました。
結果は上図の通りで、サーバー上のPHPも問題無く実行できました。
これができるということは、JavaScript API for Office + Webシステム(DB)の組み合わせで、入出力を行うインターフェースとしてWordやExcelを利用することができるわけで、アイデア次第では相当活用できるだろうと思います。
Office 2013: Introduction to apps for Office 2013 Previewに”Apps for Office can do pretty much anything a webpage can do in a browser“とある通り、インターネットブラウザーでできることはある程度実行可能なようですね。
■ 任意のWebページを表示できる?
上記「HTML以外のファイルも動かせる?」でも確認しましたが、作業ウィンドウにはHTML以外でも表示することができます。
今度はカタログ用XMLファイルのSourceLocation要素で任意のWebページを指定して、表示できるかどうかを試してみました。
結果は上図の通り、問題なく表示できました。
ちなみに作業ウィンドウアプリからアクセスした場合のブラウザ情報は、私の環境では「Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)」となっており、Internet Explorerとして扱われていることが確認できます。
■ 結局作業ウィンドウアプリはIEなの?
上記「任意のWebページを表示できる?」で答えを書いていますが、作業ウィンドウアプリの実体はInternet Explorerです。
クラスを見ても「Internet Explorer_Server」となっており、作業ウィンドウアプリにはIEが使われていることが確認できます。
ちなみに、下記コードのようにウィンドウハンドルからHTMLDocumentオブジェクトを取得すればVBAからDOM操作を行うこともできます。
Option Explicit Private Type UUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, lParam As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, riid As Any, ByVal wParam As Long, ppvObject As Object) As Long Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long Private Const SMTO_ABORTIFHUNG = &H2 Private hAppWorkPane As Long Private hIES As Long Private Const AppName = "HelloWorld" 'アプリ名指定 Public Sub Sample() '作業ウィンドウのIE部分をDOM操作(64ビット版Excelでは不可) 'http://www.mvps.org/emorcillo/en/code/vb6/iedom.shtml 参照 Dim msg As Long Dim res As Long Dim d As Object Dim IID_IHTMLDocument As UUID EnumChildWindows Application.hWnd, AddressOf EnumChildProcWP, 0& If hAppWorkPane = 0& Then Exit Sub EnumChildWindows hAppWorkPane, AddressOf EnumChildProcIES, 0& If hIES = 0& Then Exit Sub msg = RegisterWindowMessage("WM_HTML_GETOBJECT") SendMessageTimeout hIES, msg, 0&, 0&, SMTO_ABORTIFHUNG, 1000&, res If res Then With IID_IHTMLDocument .Data1 = &H626FC520 .Data2 = &HA41E .Data3 = &H11CF .Data4(0) = &HA7 .Data4(1) = &H31 .Data4(2) = &H0 .Data4(3) = &HA0 .Data4(4) = &HC9 .Data4(5) = &H8 .Data4(6) = &H26 .Data4(7) = &H37 End With If ObjectFromLresult(res, IID_IHTMLDocument, 0&, d) = 0& Then d.getElementById("btnHelloWorld").Click End If End If End Sub Private Function EnumChildProcWP(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim buf1 As String * 255 Dim buf2 As String * 255 Dim ClassName As String Dim WindowName As String GetClassName hWnd, buf1, Len(buf1) ClassName = Left(buf1, InStr(buf1, vbNullChar) - 1&) If ClassName = "MsoWorkPane" Then GetWindowText hWnd, buf2, Len(buf2) WindowName = Left(buf2, InStr(buf2, vbNullChar) - 1&) If WindowName = AppName Then hAppWorkPane = hWnd EnumChildProcWP = False Exit Function End If End If EnumChildProcWP = True End Function Private Function EnumChildProcIES(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim buf As String * 255 Dim ClassName As String GetClassName hWnd, buf, Len(buf) ClassName = Left(buf, InStr(buf, vbNullChar) - 1&) If ClassName = "Internet Explorer_Server" Then hIES = hWnd EnumChildProcIES = False Exit Function End If EnumChildProcIES = True End Function
※ 上記コードはエラー処理を行っていないため、そのまま実装することはお薦めできません。
この記事へのコメントはありません。