JSONファイルを読み込んだ結果を、Handsontableを使って表示してみた。（ついでにCSVもダウンロード）


# はじめに
jQueryの勉強をしようと思い立ち、面白そうなライブラリを探していたらHandsontableを見つけたので、さわってみた。
（基本的に通信なしで、HTMLで全て行う。）

(1) JSONファイルを読み込む
(2) JSONをHandsontableに渡して表示
(3) 表の内容をCSVにしてダウンロード


# 環境
Windows 8.1(64bit)
Internet Explorer 11

# 用意したもの
[jQuery](https://jquery.com/)
* jquery-1.11.3.min.js

[Handsontable](http://handsontable.com/)
* handsontable.full.js
* handsontable.full.css

[juantascon](https://github.com/juantascon/jquery-handsontable-csv)
* jquery.handsontable.csv.js

JSONファイル(自前)

```json:data.json
{
	"cars":[
		{"Year": 2009, "Maserati": 0, "Mazda": 2941, "Mercedes": 4303, "Mini": 354, "Mitsubishi": 5814},
		{"Year": 2010, "Maserati": 3, "Mazda": 2905, "Mercedes": 2867, "Mini": 412, "Mitsubishi": 5284},
		{"Year": 2011, "Maserati": 4, "Mazda": 2517, "Mercedes": 4822, "Mini": 552, "Mitsubishi": 6127},
		{"Year": 2012, "Maserati": 2, "Mazda": 2422, "Mercedes": 5399, "Mini": 776, "Mitsubishi": 4151}
	]
}
```

# 内容

```html:index.html
<!DOCTYPE html>
<html>
 
<head>
  <meta charset="utf-8">
  <title>Handsontable Test</title>
  <link rel="stylesheet" type="text/css" href='css/handsontable.full.css'>

  <script src='js/jquery-1.11.3.min.js'></script>   
  <script src='js/handsontable.full.js'></script>
  <script src='js/jquery.handsontable.csv.js'></script>
  <script>

  $(document).ready(function () {
    
    // 知らない人は「jquery.Deferred」で調べよう
    var d = new $.Deferred();
    
    var header;
    var jsondata;
    
    // (1) JSONファイルを読み込む
    $.getJSON("json/data.json", function(sample) {
      jsondata = sample.cars;
      
      // Handsontableで表示するヘッダーをjsonから取得して配列に格納
      // この辺ダサイんだけど、JSONデータ内の属性を一括で取得する方法とかないかな？
      header = new Array();
      var count = 0;
      for(key in jsondata[0]){
        header[count] = key;
        count++;
      }
      
      d.resolve();      
    });
    
    d.promise().then(function() {
      // (2) JSONをHandsontableに渡して表示
      var data = 
        jsondata,
        container = document.getElementById('example'),  //後ほど表を展開する要素を指定
        hot;
      
      // 表の定義
      hot = new Handsontable(container, {      //以下はデータ指定と表示オプション
        data: data,            //さっき作ったdataを指定
        minSpareRows: 1,       //表の一番下にいくつ空行を表示するか。今回は１行を空行にして表示する。
        colHeaders: header,    //カラムの名前を表示するかどうか colheader: true 表示/false 非表示
                               //カラムの名前を任意の名前にする colheader: 配列（カラム名）
        rowHeaders: true,      //ロウの名前を表示するか
        contextMenu: true,     //セルを右クリックしたときのメニューをすべて表示
        columnSorting: true    //カラムのヘッダーをクリックした際に昇順、再クリックで降順にソート
      });
    
      // 表上で以下のキーが押されても編集モードにならない
      // 変換(28)、無変換(29)、カタカナ(241)、ひらがな(242)、漢字キー(243, 244)
      hot.updateSettings({
        beforeKeyDown: function(e){
          if([28, 29, 241, 242, 243, 244].indexOf(e.keyCode) >= 0) {
            e.isImmediatePropagationEnabled = false;
            e.isImmediatePropagationStopped = function(){
              return true;
            }
          }
        }
      });
    
      // (3) 表の内容をCSVにしてダウンロード
      $("input:button").click(function(){
        // 表の状態を文字列にする。
        var csv_string = handsontable2csv.string(hot);
      
        var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
        var blob = new Blob([bom, csv_string], { type: 'text/csv'});
      
        // IE独自関数でダウンロード
        window.navigator.msSaveBlob(blob, "test.csv");
      });
    });

    // Handsontableのおまじない
    // 以下は基本的にいじらない
    function bindDumpButton() {    
  
      Handsontable.Dom.addEvent(document.body, 'click', function (e) {
  
        var element = e.target || e.srcElement;
  
        if (element.nodeName == "BUTTON" && element.name == 'dump') {
          var name = element.getAttribute('data-dump');
          var instance = element.getAttribute('data-instance');
          var hot = window[instance];
          console.log('data of ' + name, hot.getData());
        }
      });
    }
    bindDumpButton();    //関数実行
  });

  </script>
</head>

<body>
	<div id="example" class="handsontable"></div>
	<br>
	<input type="button" value="csv"/>
</body>
</html>
```

# 参考
1.[Qiita - Handsontableで日本語入力関連キーを無視する](http://qiita.com/pazworld/items/64e9c545cc622559d3e2)
2.[Qiita - 【JavaScript】連想配列のkeyとvalueの取得](http://qiita.com/glaytomohiko/items/852ea64bcfc1e4fc1b51)
3.[Qiita - 100万行扱えるグリッドw2ui GridとHandsontableの紹介](http://qiita.com/hnakamur/items/052c439674fa92848ada)
4.[新人Webエンジニアの記録。- JavaScriptだけでファイルの保存機能を実装する](http://blog.fagai.net/2014/08/09/javascript-only-save/)
5.[MSDN - Blob と msSaveBlob を使ってファイルをローカルに保存する](https://msdn.microsoft.com/ja-jp/library/hh779016(v=vs.85).aspx)