crossframe » Excel http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 SQLite for Excel ../../../201603051181/ ../../../201603051181/#comments Sat, 05 Mar 2016 10:19:27 +0000 ../../../?p=1181 一つのファイルでデータベースを扱える手軽さから、さまざまなプラットホームで使われているSQLite。Excelから直接扱えることを知り、テストしてみました。

http://sqliteforexcel.codeplex.com/

このサイトからダウンロードしたファイルだけで、特に何かインストールすることなくDBファイルに読み書きできました。
Distributionフォルダにある、SQLiteForExcel_64.xlsmを使用。
sqlite3.dllはx64フォルダのものに変更します。

環境 : Excel 2013 / Windows 10
このファイルには、SQlite3とSQlite3DemoというVBAモジュールがすでに組み込まれており、SQlite3Demoを参考に以下のプログラムを作成しました。
ボタン1でDBの作成、データ書き込み、ボタン2でDB読み込みセルに表示をしています。

Sub ボタン1_Click()
    Dim InitReturn As Long
    Dim testFile As String
    Dim RetVal As Long
    Dim myDbHandle As LongPtr
    Dim myStmtHandle As LongPtr
    
    InitReturn = SQLite3Initialize
    If InitReturn <> SQLITE_INIT_OK Then
        Debug.Print "Error Initializing SQLite. Error: " & Err.LastDllError
        Exit Sub
    End If
    
    testFile = "C:\temp\Test01.db3"
    RetVal = SQLite3Open(testFile, myDbHandle)
    Debug.Print "SQLite3Open returned " & RetVal

    RetVal = SQLite3PrepareV2(myDbHandle, "CREATE TABLE MySecondTable (TheId INTEGER, TheText TEXT, TheValue REAL)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (123, 'ABC', 42.1)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (456, 'DEF', 12.3)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (789, 'GHI', 45.6)", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal
    
    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal

    RetVal = SQLite3Close(myDbHandle)


End Sub

Sub ボタン2_Click()
    Dim testFile As String
    Dim RetVal As Long
    Dim myDbHandle As LongPtr
    Dim myStmtHandle As LongPtr
    
    testFile = "C:\temp\Test01.db3"
    
    RetVal = SQLite3Open(testFile, myDbHandle)
    Debug.Print "SQLite3Open returned " & RetVal
    
    RetVal = SQLite3PrepareV2(myDbHandle, "SELECT * FROM MySecondTable", myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal
    
    RetVal = SQLite3Step(myStmtHandle)
    Debug.Print "SQLite3Step returned " & RetVal

    r = 1
    Do While RetVal <> SQLITE_DONE
        Cells(r, 1).Value = SQLite3ColumnText(myStmtHandle, 0)
        Cells(r, 2).Value = SQLite3ColumnText(myStmtHandle, 1)
        Cells(r, 3).Value = SQLite3ColumnText(myStmtHandle, 2)
        RetVal = SQLite3Step(myStmtHandle)
        r = r + 1
    Loop
    
    RetVal = SQLite3Finalize(myStmtHandle)
    Debug.Print "SQLite3Finalize returned " & RetVal
    
    RetVal = SQLite3Close(myDbHandle)

End Sub

実行結果。
sqliteExcel

DB Browser for SQLiteでDBファイルの内容を確認。
sqliteExcel02

データベースのデフォルトデータを作成する用途に便利だと思いました。

]]>
../../../201603051181/feed/ 0
Data Interpolation / Excel ../../../201602161173/ ../../../201602161173/#comments Tue, 16 Feb 2016 13:53:23 +0000 ../../../?p=1173 既知のデータ列に対して、その区間を補間してデータをなめらかにすることをExcelで実現しているとてもいい例を見つけましたので、試してみました。

参考: http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1091176980

data

上下の散布図は、AB列、DE列に対応しています。データ補間がされているのがよくわかります。
三つの関数を組み合わせて実現されています。

Match関数
MATCH(D1,A:A,1)
A列全体からD1の値以下で最大値を検索してその場所がA列の何行目か取得

Offset関数
OFFSET($A$1,MATCH(D1,A:A,1)-1,1,2,1)
OFFSET($A$1,MATCH(D1,A:A,1)-1,0,2,1)
Match関数で取得したセルの位置から演算対象範囲を取得(A1を基準に何番目か)
A列の2行、B列の2行を取得

Trend関数
=TREND(OFFSET($A$1,MATCH(D1,A:A,1)-1,1,2,1),OFFSET($A$1,MATCH(D1,A:A,1)-1,0,2,1),D1)
既知のB列とA列の値からD1に対する新しい値E1を演算
B列の2値の関係:A列の2値の関係 = D1 : E1

よく考えられていて、すばらしいと思いました。

]]>
../../../201602161173/feed/ 0
FCell / Excel ../../../201601091162/ ../../../201601091162/#comments Sat, 09 Jan 2016 14:46:40 +0000 ../../../?p=1162 .Net in Excel

http://fcell.io/

ExcelでC#やF#を使うとき、このブログでも紹介したことがありますが、VSTOなどの技術を使います。これにはVisual Studioが必要となりますが、このツールはExelだけで、プログラミングができます。まさにこんなプロダクトが欲しかった、と思っていたものです。

環境: Excel 2016 / Windows 10
インストールは、サイトよりダウンロードした、インストーラ
FCell31_32bit.msi
FCell31_64bit.msi
のどちらかを実行するだけです。

fcell01
(起動時読み込まれているところ・・)

上記サイトにとてもわかりやすいデモムービがあります。これをそのまま実行してみました。
fcell02
ユーザ定義関数を実行しているところですが、プログラムを変更すると(Buildボタン押下)セルに結果が反映されます。(リアクティブになっていること確認)
scaleArr関数は、配列数式になっているので、範囲指定した後CTRL+SHIFT+ENTERで決定する。
fcell03

とても素晴らしいです。
ライセンスが、Enterprise Licenceと、Site Licenceというものがありますが、Enterpriseは$1000とちょっと高めなのが残念です。

マイクロソフトのプロダクトで、Excel, PowerShell, F#が好きな私としては、このあたりもっと意欲的なものが出てきてほしいと思っています。こういったツールが純正品ででてくれるとうれしいのですが・・

]]>
../../../201601091162/feed/ 0
Add-in / Office 2016 ../../../201511011139/ ../../../201511011139/#comments Sun, 01 Nov 2015 12:29:31 +0000 ../../../?p=1139 以前、以下の記事でJavaScriptによるExcelのデータ読み書きのテストをしましたが、VisualStudioを使ったものでした。

「Apps for Office」../../../20131104603/

今回は、共有フォルダからアドインを読み込む方法でテストをしてみました。環境について下記を参照しました。

参考) 「Office 2016で進化したOffice アドイン」http://www.ka-net.org/blog/?p=6213

XMLファイル、JavaScriptプログラムは下記を参考にしました。

参考) https://github.com/OfficeDev/office-js-snippet-explorer

https://github.com/OfficeDev/office-js-snippet-explorer/tree/master/excel-snippets/setValueInRange.js

プグラムは、ボタンを押すとExcelのシートに値を書き込むシンプルなものです。
Office2016_01

sample.xml

<?xml version="1.0" encoding="utf-8"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:type="TaskPaneApp">
  <Id>6492a0e5-b158-47da-9145-6804c67ed8d9</Id>
  <Version>1.0</Version>
  <ProviderName>Microsoft</ProviderName>
  <DefaultLocale>EN-US</DefaultLocale>
  <DisplayName DefaultValue="excel-js-snippet-explorer"/>
  <Description DefaultValue="Contains snippets for ExcelJS."/>
  <Capabilities>
    <Capability Name="Workbook"/>
  </Capabilities>

  <DefaultSettings>
    <SourceLocation DefaultValue="http://192.168.11.111/sample.html"/>

  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

Idは、

Wscript.Echo LCase(Mid(CreateObject(“Scriptlet.TypeLib”).GUID, 2, 36))

で生成できます。
このファイルを共有フォルダに置きExcelから選択します。
共有フォルダは、Excelを使用するWindowsに、C:\Shareのように作成して、共有設定します。
ここをExcelオプション->セキュリティセンタ->信頼できるアドインカタログのアドレスに追加します。(「メニューに表示する」をチェック)
Excelを起動して、挿入->マイアドイン->共有フォルダで、アドインが現れクリックします。
すると上の画面が表示されます。シート右側に表示されたWeb画面のボタンを押すと、数値が表示されます。
画面ファイルは、xmlファイルに書かれたアクセス先であるWebサーバをどこかに立て、そこに下記ファイルを置きます。

sample.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script>
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script>
Office.initialize = function(reason){}
$(function(){
  $("#btn").click(function(){
    Excel.run(function (ctx) {
      ctx.workbook.worksheets.getItem("Sheet1").getRange("A1:C3").values = 7;
      return ctx.sync();
    }).catch(function (error) {
      console.log(error);
    });
  });
});
</script>
</head>
<body>
<h3>Excel Add-in Test</h3>
<input id="btn" type="button" value="OK">
</bo
</html>

以前もこの件の記事を書いたときに思いましたが、JavaScriptとExcelという組み合わせは、とても可能性を秘めていると感じます。しかしまだ使いにくいと思います。もっと簡単に連携できるしくみが欲しいところです。シート上にWebViewが表示できればベストですが・・

]]>
../../../201511011139/feed/ 0
Excel Services REST API / SharePoint ../../../20141004839/ ../../../20141004839/#comments Sat, 04 Oct 2014 06:05:07 +0000 ../../../?p=839 SharePointには以前から興味を持っていましたが、最近Excelの機能で使いたいことがあり、それに関連してREST APIのテストしてみました。

環境 : Excel 2010 / Windows 7, SharePoint 2013 / Windows 2012R2
sp01
まず上のようなB,C列のデータをグラフ表示する簡単なシートを作りました。(グラフの名前をGraph1とします)
A1の初期値を変えると、B,C列のデータも変化します。
これを普通にファイルを保存すると同じように、サーバに保存します。
普通に、といったのは、ファイル名のところに、下のURLを記入するからです。

http://[ShaerPointサーバ名]/sites/cata01/docApp/Book2.xlsx

何か違和感がありますが、これで認証ポップアップがでてきて、サーバに保存します。
URLはSharePointサーバであらかじめ設定したドキュメントを置く場所をさします。

sp02
SharePointのドキュメントリストをみると、保存されているのがわかります。
そして、これをブラウザ上で表示してみます。
sp03

次に、REST APIを使って、データを変更して、グラフを変えてみます。

http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.05

sp04

http://[ShaerPointサーバ名]/sites/cata01/_vti_bin/ExcelRest.aspx/docApp/Book2.xlsx/model/Charts(‘Graph1′)?Ranges(‘A1′)=0.8

sp05

URLでこのようにExcelシート内部のデータを操作できるのが、とても興味深いです。
Webということは、JavaScript連携も可能ということなので、またの機会にやってみたいと思います。

参考 : http://msdn.microsoft.com/ja-jp/library/ee556413.aspx

]]>
../../../20141004839/feed/ 0
Erlang Riak & Excel ../../../20140223701/ ../../../20140223701/#comments Sat, 22 Feb 2014 16:31:25 +0000 http://xfra.me/?p=701 XLLoopというExcelのアドインとサーバの組み合わせで、Excelのユーザ定義関数からサーバロジックを呼び出せる面白いものをみつけたのでテストしてみました。

http://xlloop.sourceforge.net/

サーバには、なんと最近勉強をはじめたErlangがあったので、これを使ってみました。
Erlanの分散データベースRiakのデータをExcelに表示させます。
残念ながら、RiakクライアントがWindowsでうまく動いてくれなかったので、HTTPクライアントによる接続にしました。

環境 XLLoop ver 0.3.2, Excel 2010 / Windows 7

-module(server_example).
-export([start/0, stop/0, function/3]).
-behaviour(xlloop_server).
-define(PORT, 5454).

start() ->
	Pid = xlloop_server:start(?PORT, ?MODULE),
	io:format("server port : ~p~n", [?PORT]),
	register(server_example_pid, Pid),
	
stop() ->
	server_example_pid ! stop.

function(_Context, _Name, _Args) ->
	io:format("name : ~s~n", [_Name]),
	io:format("args : ~w~n", [_Args]),

	case _Name of
		"riak" -> 
			[H|T] = _Args,
			io:format("arg : ~s~n", [H]),
			Url = string:concat("http://192.168.11.11:8098/buckets/spam/keys/", H),
			{ok, {{V,200,R},Head,Body}} = httpc:request(Url),
			{str, Body};
		_ -> {str, "default"}
	end.

ソースはxlloop付属のものを参考にしました。
(io:formatはデバック用です。)

xlloop-0.3.2.iniにErlangサーバ用の設定を加えます。

[Erlang]
server=localhost:5454
function.name=ER

以下Erlangシェルで実行します。

inets:start().
c(server_example).
server_example:start().

xlloop-0.3.2.xllをExcelシートにドラッグ&ドロップします。

RiakはWindowsをサポートしていないので、Mac版を使いました。

http://basho.co.jp/riak/

環境 riak ver 1.4.7 / MacOSX 10.9
IPアドレス192.168.11.11

ulimit -n 4096
sudo ./riak start

Riakについは、SoftwareDesignPlus「データベースエンジニア養成読本」を参考にしました。

Excelからは、=ER(“riak”, “キー値”)で呼び出します。
raik

Erlangはちょっと文法的に好きになれない点がありますが、小さなプロセスを組み合わせてメッセージ通信で動かすしくみがとてもユニークで、いろいろとプログラムを作っているところです。たくさんの言語、環境がありますが、どれに絞るというより、それぞれが他に比べて得意とするところをうまく利用していきたいと思っています。
学習コストはかかりますが、モノの見方の多様性を養うことができるのでは、と思っています。

]]>
../../../20140223701/feed/ 0
SPARQL in Excel ../../../20140126687/ ../../../20140126687/#comments Sun, 26 Jan 2014 13:20:02 +0000 http://xfra.me/?p=687 今年はじめての投稿になります。
このBlogは初めてちょうど、一年になります。自分の技術向上の目的もこめて最低でも月一回はそのとき興味のあるプログラムネタを投稿しようと決めていましたが、一年なんとかやりきることができました。また今年もがんばりたいと思います。

本年もよろしくお願いいたします。

昨年からOpenDataに興味を持ち、O’Reilly「セマンティックWebプログラミング」等の書籍を読んで部分的なテストはしていましたが、実際に動くものが手元に欲しくなったので、この本のサンプルを参考にSPARQLというクエリー言語を使って試してみました。
取得したデータをExcelに読み込みたかったので、以前の投稿「Excel Add-Ins in Python, PyXLL」でテストしたPyXLLを使いました。

from pyxll import xl_func
import rdflib
from rdflib.graph import ConjunctiveGraph, Namespace

@xl_func("int n: var[]")
def testFunc1(n):
	ret = []
	FBNS = Namespace("http://rdf.freebase.com/ns/")
	g = ConjunctiveGraph()
	g.parse("C:\data\sample.n3", format="n3")
	res = g.query("""SELECT ?name ?year WHERE{
		?movie fb:film.film.initial_release_date ?year .
		?movie fb:film.film.starring ?actor .
		?actor fb:type.object.name ?name . }
		order by ?year ?name""", initNs={'fb':FBNS})
	for t in res:
		ls = list(t)
		ret.append(ls)

pyxll.xllファイルを空のシートにドラッグ&ドロップします。
name,yearの2列、検索結果数の6行以上の範囲を指定して、関数を呼びます。
引数は必要ないですが、”1″を指定しています。

sparql1
(注:範囲指定して決定するとき、Ctl-Shift-Enterを忘れずに)

PyXllの環境にrdflibを導入する必要があります。pyxll.cfgにpythonpath=.を指定して、pyxll.xllと同じフォルダにrdflibのフォルダをコピーしました。
(インストールしてからかなりたっているため、具体的なインストール手順は割愛しました。スミマセン。logsフォルダに出力されるエラーを参考にして環境を構築するとうまくできると思います。)

以下が使用したデータです。
書籍にあったものを、抜粋して作りました。
sample.n3

@prefix fb: <http://rdf.freebase.com/ns/> .

<http://rdf.freebase.com/ns/en.hollywood_homicide> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.ron_shelton> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.harrison_ford> , 
    <http://rdf.freebase.com/ns/en.kurupt> , 
    <http://rdf.freebase.com/ns/en.robert_wagner> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2003" .

<http://rdf.freebase.com/ns/en.k_19_the_widowmaker> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.kathryn_bigelow> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.harrison_ford> , 
    <http://rdf.freebase.com/ns/en.joss_ackland> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2002" .

<http://rdf.freebase.com/ns/en.becoming_dick> 
    <http://rdf.freebase.com/ns/film.film.directed_by> 
    <http://rdf.freebase.com/ns/en.bob_saget> ;
<http://rdf.freebase.com/ns/film.film.starring> 
    <http://rdf.freebase.com/ns/en.robert_wagner> , 
    <http://rdf.freebase.com/ns/en.bob_saget> ;
<http://rdf.freebase.com/ns/film.film.initial_release_date> "2000" .

<http://rdf.freebase.com/ns/en.kurt_russell> 
    <http://rdf.freebase.com/ns/type.object.name> "Kurt Russell" .
<http://rdf.freebase.com/ns/en.bob_saget> 
    <http://rdf.freebase.com/ns/type.object.name> "Bob Saget" .
<http://rdf.freebase.com/ns/en.harrison_ford> 
    <http://rdf.freebase.com/ns/type.object.name> "Harrison Ford" .
<http://rdf.freebase.com/ns/en.robert_wagner> 
    <http://rdf.freebase.com/ns/type.object.name> "Robert Wagner" .
<http://rdf.freebase.com/ns/en.kurupt> 
    <http://rdf.freebase.com/ns/type.object.name> "Kurupt" .

OpenDataはいろんなデータフォーマットがあるので、目的のサンプルデータをつくるのにもう少し調査が必要と感じました。
まずは第一歩としてここまでにしたいと思います。

]]>
../../../20140126687/feed/ 0
D3.js from Excel ../../../20131214667/ ../../../20131214667/#comments Sat, 14 Dec 2013 07:37:39 +0000 http://xfra.me/?p=667 前回、Excelデータのビジュアライズに、WebViewのバージョンの関係によりD3.jsでなくjqplotを使用しましたが、Selenium IDEを使うと、WebViewでなくWebブラウザを使用できるので、これならD3.jsでもと思い、トライしてみました。

このツールはWebアプリのテスト等に使うもので、ブラウザ操作を自動的にできるなどとても強力なツールです。また各種プログラムコードも出力してくれます。

selenium-vba

https://code.google.com/p/selenium-vba/

ここではVBAからseleniumアドインを組み込んだFirefoxをコントロールする方法でテストしました。これならVBAからFirefoxで表示されているページのJavaScriptを呼び出すことができます。

環境 : SeleniumWrapperSetup-1.0.16.0.exe, Firefox 23.0.1, Excel 2010 / Windows 7
Excel Visual Basic for Application -> ツール -> 参照設定で、SeleniumWrapper Type Library を追加

Private Sub CommandButton1_Click()
   Dim selenium As New SeleniumWrapper.WebDriver
   selenium.Start "firefox", "file:///C:\d3.html"
   selenium.Open "file:///C:\d3.html"
   For i = 1 To 20
       v1 = Sheets(1).Cells(i, 1).Value
       v2 = Sheets(1).Cells(i, 2).Value
       v3 = Sheets(1).Cells(i, 3).Value

       selenium.getEval "setData({'clm1':" + Str(v1) + ", 'clm2':" + Str(v2) + ", 'clm3':" + Str(v3) + "});"
   Next i
   selenium.getEval "plot();"
End Sub

d3_2

D3.jsは以下のサンプルを使いました。

http://bl.ocks.org/mbostock/raw/7586334/

d3_1

サンプルでは、csvからファイルを読み込むようになっていますが、これを以下のように変更しました。
d3.html抜粋

var cars = [];
function setData(d)
{
	cars.push(d);
}
function plot(){
  x.domain(dimensions = d3.keys(cars[0]).filter(function(d) {
    return d != "name" && (y[d] = d3.scale.linear()
        .domain(d3.extent(cars, function(p) { return +p[d]; }))
        .range([h, 0]));
  }));
 .....
}
.....

Firefoxにもアドインを入れておく必要があります。
SeleniumIDE
これはなかなかいいかも。

]]>
../../../20131214667/feed/ 0
jQueryPlot from Excel ../../../20131207651/ ../../../20131207651/#comments Sat, 07 Dec 2013 14:35:10 +0000 http://xfra.me/?p=651 データビジュアライゼーション。最近とてもブームでもあり私自身も大変興味深い領域です。Excelデータをビジュアライゼーションするとき、どんな形が面白そうかと考えてみたところ、WebでJavaScriptライブラリという結論になりました。Webで表示させるためには、VSTOを使ってWindowsForm上のWebViewにhtmlファイルを読み込ませる方法にしました。もともと今大人気のD3.jsを使いたかったのですが、WebViewがIE7相当のため(Webサーバログで確認)動作しませんでした。対応しないメソッドがあったり、SVGを使うということが原因と思われます。(ちなみにQtのQWebViewでは表示できました。)しかしながら個人的にこのD3.jsを初めて知ったときは、jQueryが登場したときと同じくらい衝撃を受けました。ちょっとはまっています。
そこでD3.jsのかわりにIE7にも対応しているjQueryPlot(http://www.jqplot.com/)を使うことにしました。

前置きが長くなりましたが、ExcelシートにあるデータをWindowFormのボタンを押すとWebViewのグラフが更新されるデモをつくってみました。

jqplot1

jqplotdata1

データを変更(赤字部分)してボタン押下

jqplot2

jqplotdata2

環境 : VisualStudio 2010, Excel 2010 / Windows 7
ThisWorkbook.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace ExcelWorkbook_Web
{
    public partial class ThisWorkbook
    {
        private void ThisWorkbook_Startup(object sender, System.EventArgs e)
        {
            Form1 fm = new Form1();
            fm.Show();
        }
        public String getData()
        {
            String str = "[";

            for (int i = 1; i <= 7; i++)
            {
                str += "[";

                var o1 = Globals.Sheet1.Cells[i, 2].Value;
                var o2 = Globals.Sheet1.Cells[i, 3].Value;
                var o3 = Globals.Sheet1.Cells[i, 4].Value;

                str += o1.ToString() + "," + o2.ToString() + "," + o3.ToString();
                var o4 = Globals.Sheet1.Cells[i, 1].Value;
                str += ",'" + o4.ToString() + "'";
                str += "]";
                if (i != 7)
                {
                    str += ",";
                }
            }
            str += "]";
            return str;
        }

        private void ThisWorkbook_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO デザイナーで生成されたコード
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisWorkbook_Startup);
            this.Shutdown += new System.EventHandler(ThisWorkbook_Shutdown);
        }
        #endregion
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ExcelWorkbook_Web
{
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            webBrowser1.ObjectForScripting = this;
            webBrowser1.Navigate(new Uri("file:///C:/work/test.html"));

        }

        private void button1_Click(object sender, EventArgs e)
        {
            String str = Globals.ThisWorkbook.getData();
            object[] args = {str};
            webBrowser1.Document.InvokeScript("plot", args);
        }
    }
}

test.html

<html>
<head>
<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
<script type="text/javascript" src="jqplot.bubbleRenderer.min.js"></script>
<link rel="stylesheet" type="text/css" href="jquery.jqplot.min.css" />
<script>
function plot(arg)
{
    var arr = eval(arg);

    plot1 = $.jqplot('chart1',[arr],{
        title: 'Transparent Bubbles',
        seriesDefaults:{
            renderer: $.jqplot.BubbleRenderer,
            rendererOptions: {
                bubbleAlpha: 0.6,
                highlightAlpha: 0.8
            },
            shadow: true,
            shadowAlpha: 0.05
        }
    });
}
</script>
</head>
<body>
<div id="chart1" style="height:300px;width:300px; "></div>
</body>
</html>

Excelシートのデータを変更してボタンを押すと、BubbleChart(というらしい)が変化する模様は、なかなかわかりやすいくて使いやすいと思いました。
いろいろと応用がききそうです。

]]>
../../../20131207651/feed/ 0
Apps for Office ../../../20131104603/ ../../../20131104603/#comments Mon, 04 Nov 2013 12:14:50 +0000 http://xfra.me/?p=603 VisualStudio 2013のプロジェクトテンプレートに、Office 2013用アプリというテンプレートがC#の下にあります。
これを以下のサイトを参考に、Apps for Officeをつくってみました。(Excel)

How to: Create your first task pane or content app by using Visual Studio

http://msdn.microsoft.com/library/office/fp142161%28v=office.15%29

その前に、これに取り組もうと思ったのは、なんとJavaScriptでExcelのCellを読み書きできてしまうからです。どのように使うものなのかということより、まずこれを試したかったからです。
(しかしいつもネーミングが汎用的でわかりづらいですね。(ストアアプリとかも) 日本語だとOfficeアプリ? Office Web Appsと似ている・・など、もう少し機能が明確化できる名前だといいのですが。)

Office用アプリの作成で、「Excelのコンテンツアプリ」を選びました。参考サイトとは違うのですが、作業ウィンドウという特別なところにおかれるのではなく、画像やグラフのように任意の場所に置きたかったからです。
oa1

環境 VisualStudio 2013, Office 2013 / Windows 8.1
Home.js

(function () {
    "use strict";
    Office.initialize = function (reason) {
        $(document).ready(function () {
            app.initialize();

            $('#btnWrite').click(writeText);
            $('#btnRead').click(readText);
        });
    };
    function writeText() {
        Office.context.document.setSelectedDataAsync($('#wtest').text(),
            function (asyncResult) {
                if (asyncResult.status === "failed") {
                    $('#result').text(asyncResult.error.message);
                }
            }
        )
    }
    function readText() {
        Office.context.document.getSelectedDataAsync("matrix",
            function (asyncResult) {
                if (asyncResult.status === "failed") {
                    $('#result').text(asyncResult.error.message);
                }
                else {
                    $('#rtest').text(asyncResult.value);
                }
            }
        );
    }
})();

Home.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <title></title>
    <script src="../../Scripts/jquery-1.9.1.js" type="text/javascript"></script>

    <link href="../../Content/Office.css" rel="stylesheet" type="text/css" />
    <script src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js" type="text/javascript"></script>

    <link href="../App.css" rel="stylesheet" type="text/css" />
    <script src="../App.js" type="text/javascript"></script>
    <script src="../Visualization.js" type="text/javascript"></script>

    <link href="Home.css" rel="stylesheet" type="text/css" />
    <script src="Home.js" type="text/javascript"></script>
</head>
<body>
    <center><h3>Apps for Office Test</h3></center>
    <button id="btnWrite">Write Text</button>
    <button id="btnRead">Read Text</button>
    <div id="wtest">123456789</div>
    <div id="rtest">---</div>
    <hr />
    <div id="result">message : </div>
</body>
</html>

デフォルトでjQueryサポートです。最近つかいまくってますね。またC#のプロジェクトなのにC#はどこにもでてきません。

初期画面
oa2

‘Write Text’をクリック(表示領域をあらかじめ選択してからも可。コードを変更して配列を書き込むことも可)
そして選択箇所そのままで’Read Text’をクリック
oa3

値を入力後、範囲を指定して’Read Text’をクリック
oa4

範囲を指定して’Write Text’をクリック
oa5
配列を書き込むようにしていないのでエラー

オフラインローカルのExcelファイルとしては使えないみたいですが(まだ調査不足ですが)、それがちょっと残念です。(ExcelシートにWebViewが埋め込まれ、相互データ連携ができると、Webの柔軟性からかなり用途が広がるのですが)
でもなかなか面白い機能です。

(追記:2014/09/27)SharePointに登録して、Officeアプリとして挿入が可能。

]]>
../../../20131104603/feed/ 0