jQueryPlot from Excel
データビジュアライゼーション。最近とてもブームでもあり私自身も大変興味深い領域です。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のグラフが更新されるデモをつくってみました。
データを変更(赤字部分)してボタン押下
環境 : 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(というらしい)が変化する模様は、なかなかわかりやすいくて使いやすいと思いました。
いろいろと応用がききそうです。