独自の書式機能を実装するとクライアントサイドExcelIOの実行に失敗する

文書番号 : 41337     文書種別 : 不具合     登録日 : 2017/09/25     最終更新日 : 2017/09/25
文書を印刷する
対象製品
SpreadJS 9J
発生環境
9.20171.0
状況
回避方法あり
詳細
製品のカスタム書式機能を使用し、独自の書式設定を行ったシートでsaveメソッドを実行するとエラーが発生します。

【再現手順】
1.以下の再現コードを実行します
2.「export」ボタンを押下します

【動作結果】
スクリプトエラー「Uncaught TypeError: e.formatter.toUpperCase is not a function」が発生します。

【再現コード】
// 本コードを実行するHTMLページに以下のボタン、入力エリアを記述してください。
// <input type="text" placeholder="ファイル名" id="exportFileName" value="export.xlsx" />
// <input type="button" value="export" onclick="exportExcel();" //>
//設定されたテキストを表示するカスタム書式
function HyperLinkFormatter(displayText) {
  this.displayText = displayText || "";
}
HyperLinkFormatter.prototype = new GC.Spread.Formatter.FormatterBase();
HyperLinkFormatter.prototype.format = function (obj) {
  return this.displayText;
}

//ページロード時の処理
window.onload = function() {
  'use strict';
  var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
  var sheet = spread.getActiveSheet();

  sheet.suspendPaint();

  var cellType1 = new GC.Spread.Sheets.CellTypes.HyperLink();
  var text1 = "google";
  var url1 = "http://www.google.co.jp/";
  cellType1.text(text1);
  var cell1 = sheet.getCell(0, 0);
  // 独自実装したカスタム書式を設定します
  cell1.cellType(cellType1).value(url1).formatter(new HyperLinkFormatter(text1));
  
  sheet.resumePaint();
};

//エクスポートボタン押下時の処理
function exportExcel() {
  'use strict';
  //保存ファイル名の取得
  var fileName = document.getElementById("exportFileName").value;
  if (fileName.substr(-5, 5) !== '.xlsx') {
    fileName += '.xlsx';
  }

  //ExcelIOインスタンスの生成
  var excelIo = new GC.Spread.Excel.IO();

  //jsonデータの取得
  var spread = GC.Spread.Sheets.findControl(document.getElementById('ss'));
  var json = JSON.stringify(spread.toJSON());

  // エクセルファイルエクスポート処理
  excelIo.save(json, function(blob) {
    // ファイル書き出し成功時の処理
    saveAs(blob, fileName);
  }, function(e) {
    // ファイル書き出し失敗時の処理
    console.log(e);
  });
}
回避方法
カスタム書式のprototype.toJSONメソッドで"GENERAL"を戻り値とするように設定することで、現象の回避が可能です。

【現象再現コードへの回避コード追加例】
HyperLinkFormatter.prototype.toJSON = function(){
return "GENERAL";
}