独自の書式機能を実装するとクライアントサイドExcelIOの実行に失敗する
対象製品
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);
});
}
【再現手順】
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";
}
【現象再現コードへの回避コード追加例】
HyperLinkFormatter.prototype.toJSON = function(){
return "GENERAL";
}