概要と基本的な使い方

SpreadJSは、大きなExcelファイルのインポートやエクスポート処理の時間を短縮し、SpreadJS独自のファイル形式で保存した際のファイルサイズを従来よりも小さくするための、まったく新しい方法を提供します。

また、ユーザーがExcelファイルの数百あるワークシートのうち、いくつかのワークシートのみ必要とする場合、関連するワークシートを素早く読み込む方法も提供します。

説明
app.js
index.html
styles.css

SpreadJSファイル機能を使用するために、ドキュメントのheadセクションのSpreadJSの参照の下に、関連するjsファイルのリンクを追加する必要があります。

例:

<head>
   ...
   <script src='.../spreadjs/gc.spread.sheets.all.x.x.x.min.js' type='text/javascript'></script>
   <script src='.../spreadjs/plugins/gc.spread.sheets.io.x.x.x.min.js' type='text/javascript'></script>
</head>

SpreadJSは、sjsファイル(SpreadJS独自ファイル)の読み込みと保存、Excelファイル(xlsx)、ssjson(SpreadJS独自の旧形式ファイル)と csvファイルのインポートとエクスポートをサポートします。

例:

// sjsファイルを読み込みます。
spread.open(file, function () {
   // ファイル読み込みが成功した場合のコールバック
   // ここで任意の処理を実行します
}, function (e) {
   console.log(e); // エラーの場合のコールバック
});

// sjsファイルを保存します。
spread.save(function (blob) {
   // blobをファイルに保存します
   saveAs(blob, fileName);
}, function (e) {
   console.log(e);
});

// xlsxファイルをインポートします。
spread.import(file, function () {
   // ファイル読み込みが成功した場合のコールバック
   // ここで任意の処理を実行します
}, function (e) {
   console.log(e); // エラーの場合のコールバック
}, {
   // ファイル形式を指定します。ssjson, csvもFileTypeで設定します。
   fileType: GC.Spread.Sheets.FileType.excel
});

// xlsxファイルをエクスポートします。
spread.export(function (blob) {
   // blobをファイルに保存します
   saveAs(blob, fileName);
}, function (e) {
   console.log(e);
}, {
   // ファイル形式を指定します。ssjson, csvもFileTypeで設定します。
   fileType: GC.Spread.Sheets.FileType.excel
});

class GC.Spread.Sheets.Workbook

export class Workbook {
  ///* function GC.Spread.Sheets.@Workbook.save(successCallBack?: Function, errorCallBack?: Function, saveOptions?: GC.Spread.Sheets.SaveOptions): void
  /**
  * SpreadJS を SpreadJSファイル(SJSファイル形式)に保存します。
  * @param {function} successCallBack - SpreadJS の保存が完了したときの成功コールバック。引数として Blob を受け取ります。
  * @param {function} errorCallBack - SpreadJS の保存でエラーが発生したときのエラーコールバック。
  * @param {GC.Spread.Sheets.SaveOptions} saveOptions - 保存オプション。
  * @example
  * spread.save(function (blob) {
  *    // blobをファイルに保存します
  *    saveAs(blob, fileName);
  * }, function (e) {
  *    console.log(e);
  * }, { includeUnusedNames: false });
  */
  Workbook.prototype.save = function (this: Workbook, successCallBack?: (content: Blob) => {}, errorCallBack?, saveOptions?: SaveOptions): void;

  ///* function GC.Spread.Sheets.@Workbook.open(file: File, successCallback?: Function, errorCallback?: Function, openOptions?: GC.Spread.Sheets.OpenOptions)
  /**
  * SpreadJSファイル(SJSファイル形式)を読み込みます。
  * @param {Blob} file - SpreadJSファイル(SJSファイル)。
  * @param {function} successCallBack - SpreadJSファイルの読み込みが完了したときの成功コールバック。
  * @param {function} errorCallBack - SpreadJSファイルの読み込みでエラーが発生したときのエラーコールバック。
  * @param {GC.Spread.Sheets.OpenOptions} [openOptions] - 読み込みオプション。
  * @example
  * // openメソッドの使用例を示します
  * // ファイルを取得します
  * var file = document.getElementById("importFileName").files[0];
  * // ファイルを開きます
  * spread.open(file, function () {
  *    // ファイル読み込みが成功した場合のコールバック
  *    // ここで任意の処理を実行します
  * }, function (e) {
  *  console.log(e); // エラーの場合のコールバック
  * });
  */
  Workbook.prototype.open = function (file: Blob, successCallback?, errorCallback?, openOptions?: OpenOptions): void;

  ///* function GC.Spread.Sheets.@Workbook.export(successCallBack?: Function, errorCallBack?: Function, exportOptions?: GC.Spread.Sheets.ExportOptions): void
  /**
  * SpreadJSを Excelファイル、SSJSONファイル、CSVファイルにエクスポートします。
  * @param {function} [successCallBack] エクスポートが完了したときの成功コールバック。引数として Blob を受け取ります。
  * @param {function} [errorCallBack] ファイルのエクスポートでエラーが発生したときのエラーコールバック。
  * @param {GC.Spread.Sheets.ExportOptions} [exportOptions] - エクスポートのオプション。
  * @example
  * spread.export(function (blob) {
  *    // blobをファイルに保存します
  *    saveAs(blob, fileName);
  * }, function (e) {
  *    console.log(e);
  * }, {
  *    fileType: GC.Spread.Sheets.FileType.excel,
  *    includeBindingSource: true
  * });
  */
  Workbook.prototype.export = function (successCallBack?: (content: Blob) => {}, errorCallBack?, exportOptions?: ExportOptions);

  ///* function GC.Spread.Sheets.@Workbook.import(file: File, successCallback?: Function, errorCallback?: Function, importOptions?: GC.Spread.Sheets.ImportOptions)
  /**
  * Excelファイル、SSJSONファイル、CSVファイルをインポートします。
  * @param {File} file - インポートするExcelファイル、SSJSONファイル、CSVファイル。
  * @param {function} [successCallBack] - インポートが完了したときの成功コールバック。
  * @param {function} [errorCallBack] - インポートでエラーが発生したときのエラーコールバック。
  * @param {GC.Spread.Sheets.ImportOptions} [importOptions] - インポートのオプション。
  * @example
  * // importメソッドの使用例を示します
  * // ファイルを取得します
  * var file = document.getElementById("importFileName").files[0];
  * // ファイルをインポートします
  * spread.import(file, function () {
  *    // ファイル読み込みが成功した場合のコールバック
  *    // ここで任意の処理を実行します
  * }, function (e) {
  *    console.log(e); // エラーの場合のコールバック
  * }, {
  *    fileType: GC.Spread.Sheets.FileType.excel
  * });
  */
  Workbook.prototype.import = function (file: File, successCallback?, errorCallback?, importOptions?: ImportOptions);
}

GC.Spread.Sheets.SaveOptions

///* typedef GC.Spread.Sheets.SaveOptions
/**
 * @typedef GC.Spread.Sheets.SaveOptions
 * @property {boolean} [includeBindingSource] -保存時にバインディングソースを含めるかどうか。デフォルトは false です。
 * @property {boolean} [includeStyles] - 保存時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 保存時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [saveAsView] - 保存時に表示形式の書式を適用するかどうか。デフォルトは false です。
 * @property {boolean} [includeAutoMergedCells] - 保存時に自動的に結合されたセルを含めるかどうか。デフォルトは false です。
 * @property {boolean} [includeCalcModelCache] - 保存時に計算のキャッシュデータを含めるかどうか。それらのデータを含むファイルを開くと、より高速になる可能性があります。デフォルトは false です。
 * @property {boolean} [includeUnusedNames] - 保存時に未使用のカスタム名を含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeEmptyRegionCells] - 使用されるデータ範囲外の空のセル(データがないセルまたはスタイルのみのセル) を含めるかどうか。
 * @property {boolean} [saveR1C1Formula] - R1C1形式の数式をファイルに保存するかどうか。SJSファイルの場合のみ有効です。デフォルトは false です。
 */

GC.Spread.Sheets.OpenOptions

///* typedef GC.Spread.Sheets.OpenOptions
/**
 * @typedef GC.Spread.Sheets.OpenOptions
 * @property {boolean} [includeStyles] - 読み込み時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 読み込み時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [fullRecalc] - データの読み込み後に計算を行うかどうか。デフォルトは false です。
 * @property {boolean} [dynamicReferences] - 動的参照を使用して関数を計算するかどうか。デフォルトは true です。
 * @property {boolean} [calcOnDemand] - 数式計算が要求されたときにのみ計算するかどうか。デフォルトは false です。
 * @property {boolean} [incrementalCalculation] - 読み込み時にUIをブロックせずに数式を増分計算で計算するかどうか。デフォルトは false です。
 * @property {boolean} [includeUnusedStyles] - 読み込み時に未使用の名前スタイルを含めるかどうか。デフォルトは true です。
 * @property {GC.Spread.Sheets.OpenMode} [openMode] - normal(標準)、lazy(遅延)、incremental(増分)のオープンモード。 デフォルトはnormalです。
 * @property {GC.Spread.Sheets.ProgressFunctionType} [progress] -  各オープンモードの進行状況コールバック関数。
 */

 ///* enum GC.Spread.Sheets.OpenMode
/**
 * openメソッドの オープンモードオプション
 * @enum {number}
 */
 enum OpenMode {
    /**
    * 標準オープンモード。ファイルを開くと、UIとUIイベントは特定の時点で更新され応答します。
    */
    normal = 0,
    /**
    * 遅延オープンモード。ファイルを開くと、アクティブなシートのみが直接読み込まれます。他のシートは、使用されるときに読み込まれます。
    */
    lazy = 1,
    /**
    * 増分オープンモード。ファイルが開かれると、データ読み込み中にUIとUIイベントが更新され、直接応答されます。
    */
    incremental = 2
}

///* typedef GC.Spread.Sheets.ProgressFunctionType
/**
 * @typedef GC.Spread.Sheets.ProgressFunctionType
 * @param {object} progressArgs - 進行状況の引数。
 * @param {string} [progressArgs.sheetName] - 現在の読み込み中のシート名。
 * @param {string} progressArgs.step - 現在の読み込み処理ステップ。
 * @param {number} progressArgs.progress - 現在の読み込み状況。0 から 1 の間。
 * @returns {void}
 * @description 増分ロード処理の進行中に呼び出されるコールバック。
 */
export type ProgressFunctionType = (progressArgs: ProgressArgs) => void;

GC.Spread.Sheets.ImportOptions

///* typedef GC.Spread.Sheets.ImportOptions
/**
 * @typedef {GC.Spread.Sheets.FileOptions & (GC.Spread.Sheets.ImportCsvOptions | GC.Spread.Sheets.ImportSSJsonOptions | GC.Spread.Sheets.ImportXlsxOptions)} GC.Spread.Sheets.ImportOptions - ファイルインポートのオプション
 */
/**
 GC.Spread.Sheets.FileOptions & (GC.Spread.Sheets.ImportCsvOptions | GC.Spread.Sheets.ImportSSJsonOptions | GC.Spread.Sheets.ImportXlsxOptions)
*/

///* typedef GC.Spread.Sheets.FileOptions
/**
 * @typedef GC.Spread.Sheets.FileOptions - ファイルのオプション。
 * @property {GC.Spread.Sheets.FileType} fileType - ファイルタイプ。
 */
/**
{
    fileType: GC.Spread.Sheets.FileType
}
*/

GC.Spread.Sheets.ExportOptions

///* typedef GC.Spread.Sheets.ExportOptions
/**
 * @typedef {GC.Spread.Sheets.FileOptions & (GC.Spread.Sheets.ExportCsvOptions | GC.Spread.Sheets.ExportSSJsonOptions | GC.Spread.Sheets.ExportXlsxOptions)} GC.Spread.Sheets.ExportOptions - ファイルエクスポートのオプション
 */
/**
 GC.Spread.Sheets.FileOptions & (GC.Spread.Sheets.ExportCsvOptions | GC.Spread.Sheets.ExportSSJsonOptions | GC.Spread.Sheets.ExportXlsxOptions)
*/

///* typedef GC.Spread.Sheets.FileOptions
/**
 * @typedef GC.Spread.Sheets.FileOptions - ファイルのオプション。
 * @property {GC.Spread.Sheets.FileType} fileType - ファイルタイプ。
 */
/**
{
    fileType: GC.Spread.Sheets.FileType
}
*/

GC.Spread.Sheets.ImportXlsxOptions

///* typedef GC.Spread.Sheets.ImportXlsxOptions
/**
 * @typedef GC.Spread.Sheets.ImportXlsxOptions
 * @property {boolean} [includeStyles] - 読み込み時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 読み込み時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [frozenColumnsAsRowHeaders] - 読み込み時に固定列を行ヘッダーとして扱うかどうか。デフォルトは false です。
 * @property {boolean} [frozenRowsAsColumnHeaders] - 読み込み時に固定行を列ヘッダーとして扱うかどうか。デフォルトは false です。
 * @property {boolean} [fullRecalc] - データの読み込み後に計算を行うかどうか。デフォルトは false です。
 * @property {boolean} [dynamicReferences] - 動的参照を使用して関数を計算するかどうか。デフォルトは true です。
 * @property {boolean} [calcOnDemand] - 数式計算が要求されたときにのみ計算するかどうか。デフォルトは false です。
 * @property {boolean} [incrementalCalculation] - 読み込み時にUIをブロックせずに数式を増分計算で計算するかどうか。デフォルトは false です。
 * @property {boolean} [includeUnusedStyles] - 読み込み時に未使用の名前スタイルを含めるかどうか。デフォルトは true です。
 * @property {GC.Spread.Sheets.OpenMode} [openMode] - normal(標準)、lazy(遅延)、incremental(増分)のオープンモード。 デフォルトはnormalです。
 * @property {GC.Spread.Sheets.ProgressFunctionType} [progress] - 各オープンモードの進行状況コールバック関数。
 */
/**
{
    includeStyles?: boolean;
    frozenColumnsAsRowHeaders?: boolean;
    frozenRowsAsColumnHeaders?: boolean;
    includeFormulas?: boolean;
    fullRecalc?: boolean;
    dynamicReferences?: boolean;
    calcOnDemand?: boolean;
    includeUnusedStyles?: boolean;
    openMode?: GC.Spread.Sheets.OpenMode;
    progress?: GC.Spread.Sheets.ProgressFunctionType
}
*/

GC.Spread.Sheets.ExportXlsxOptions

///* typedef GC.Spread.Sheets.ExportXlsxOptions
/**
 * @typedef GC.Spread.Sheets.ExportXlsxOptions
 * @property {boolean} [includeBindingSource] - 保存時にバインディングソースを含めるかどうか。デフォルトは false です。
 * @property {boolean} [includeStyles] - 保存時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 保存時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [saveAsView] - 保存時に表示形式の書式を無視するかどうか。デフォルトは false です。
 * @property {boolean} [rowHeadersAsFrozenColumns] - 保存時に行ヘッダーを固定列として扱うかどうか。デフォルトは false です。
 * @property {boolean} [columnHeadersAsFrozenRows] - 保存時に列ヘッダーを固定行として扱うかどうか。デフォルトは false です。
 * @property {boolean} [includeAutoMergedCells] - 保存時に自動的に結合されたセルを含めるかどうか。デフォルトは false です。
 * @property {boolean} [includeUnusedNames] - 保存時に未使用のカスタム名を含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeEmptyRegionCells] - 使用されるデータ範囲外の空のセル(データがないセルまたはスタイルのみのセル) を含めるかどうか。
 */
/**
{
    includeBindingSource?: boolean;
    includeStyles?: boolean;
    includeFormulas?: boolean;
    saveAsView?: boolean;
    rowHeadersAsFrozenColumns?: boolean;
    columnHeadersAsFrozenRows?: boolean;
    includeUnusedNames?: boolean;
    includeEmptyRegionCells?: boolean;
    includeAutoMergedCells?: boolean;
}
*/

GC.Spread.Sheets.ImportCsvOptions

///* typedef GC.Spread.Sheets.ImportCsvOptions
/**
 * @typedef GC.Spread.Sheets.ImportCsvOptions
 * @property {string} [encoding] - csv エンコーディング タイプ。デフォルトのエンコーディング タイプは「UTF-8」です。
 * @property {string} [rowDelimiter] - 行の最後に付加される行区切り文字。デフォルトの行区切り文字は '\r\n' です。
 * @property {string} [columnDelimiter] - 列の最後に付加される列区切り文字。デフォルトの列区切り文字は ',' です。
 */
/**
{
    rowDelimiter?: string;
    columnDelimiter?: string;
    encoding?: string;
}
*/

.Spread.Sheets.ExportCsvOptions

///* typedef GC.Spread.Sheets.ExportCsvOptions
/**
 * @typedef GC.Spread.Sheets.ExportCsvOptions
 * @property {string} [encoding] - csv エンコーディング タイプ。デフォルトのエンコーディング タイプは「UTF-8」です。
 * @property {string} [rowDelimiter] - 行の最後に付加される行区切り文字。デフォルトの行区切り文字は '\r\n' です。
 * @property {string} [columnDelimiter] - 列の最後に付加される列区切り文字。デフォルトの列区切り文字は ',' です。
 * @property {object} [range] - 範囲の情報。
 * @param {number} [range.sheetIndex] - シートインデックス。デフォルトのシートインデックスは、アクティブなシートインデックスです。
 * @param {number} [range.row] - 開始行。デフォルトの行インデックスは 0 です。
 * @param {number} [range.column] - 開始列。デフォルトの列インデックスは 0 です。
 * @param {number} [range.rowCount] - 行数。デフォルトの行数は、アクティブなシートの行数です。
 * @param {number} [range.columnCount] - 列数。デフォルトの列数は、アクティブなシートの列数です。

 */
/**
{
    encoding?: string;
    rowDelimiter?: string;
    columnDelimiter?: string;
    range?: {
        sheetIndex: number;
        row: number;
        column: number;
        rowCount: number;
        columnCount: number;
    }
}
*/

GC.Spread.Sheets.ImportSSJsonOptions

///* typedef GC.Spread.Sheets.ImportSSJsonOptions
/**
 * @typedef GC.Spread.Sheets.ImportSSJsonOptions
 * @property {boolean} [includeStyles] - 読み込み時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 読み込み時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [frozenColumnsAsRowHeaders] - 読み込み時に固定列を行ヘッダーとして扱うかどうか。デフォルトは false です。
 * @property {boolean} [frozenRowsAsColumnHeaders] - 読み込み時に固定行を列ヘッダーとして扱うかどうか。デフォルトは false です。
 * @property {boolean} [fullRecalc] - データの読み込み後に再計算を行うかどうか。デフォルトは true です。
 * @property {boolean | object} [incrementalLoad] - 増分読み込みを使用するか、増分読み込みのコールバックを使用するか。デフォルトは false です。
 * @param {function} [incrementalLoad.loading] - 増分読み込みが進行中に呼び出されるコールバック。
 * @param {function} [incrementalLoad.loaded] - 増分読み込みが完了したときのコールバック。
 */
/**
{
    includeStyles?: boolean;
    incrementalLoad?: any;
    frozenColumnsAsRowHeaders?: boolean;
    frozenRowsAsColumnHeaders?: boolean;
    includeFormulas?: boolean;
    fullRecalc?: boolean;
}
*/

GC.Spread.Sheets.ExportSSJsonOptions

///* typedef GC.Spread.Sheets.ExportSSJsonOptions
/**
 * @typedef GC.Spread.Sheets.ExportSSJsonOptions
 * @property {boolean} [includeBindingSource] - 保存時にバインディングソースを含めるかどうか。デフォルトは false です。
 * @property {boolean} [includeStyles] - 保存時にスタイルを含めるかどうか。デフォルトは true です。
 * @property {boolean} [includeFormulas] - 保存時に数式を含めるかどうか。デフォルトは true です。
 * @property {boolean} [saveAsView] - 保存時に表示形式の書式を無視するかどうか。デフォルトは false です。
 * @property {boolean} [rowHeadersAsFrozenColumns] - 保存時に行ヘッダーを固定列として扱うかどうか。デフォルトは false です。
 * @property {boolean} [columnHeadersAsFrozenRows] - 保存時に列ヘッダーを固定行として扱うかどうか。デフォルトは false です。
 * @property {boolean} [includeAutoMergedCells] - 保存時に自動的に結合されたセルを含めるかどうか。デフォルトは false です。
 */
/**
{
    includeBindingSource?: boolean;
    includeStyles?: boolean;
    includeFormulas?: boolean;
    saveAsView?: boolean;
    rowHeadersAsFrozenColumns?: boolean;
    columnHeadersAsFrozenRows?: boolean;
    includeAutoMergedCells?: boolean;
}
*/
SpreadJSファイル機能を使用するために、ドキュメントのheadセクションのSpreadJSの参照の下に、関連するjsファイルのリンクを追加する必要があります。 例: SpreadJSは、sjsファイル(SpreadJS独自ファイル)の読み込みと保存、Excelファイル(xlsx)、ssjson(SpreadJS独自の旧形式ファイル)と csvファイルのインポートとエクスポートをサポートします。 例: class GC.Spread.Sheets.Workbook GC.Spread.Sheets.SaveOptions GC.Spread.Sheets.OpenOptions GC.Spread.Sheets.ImportOptions GC.Spread.Sheets.ExportOptions GC.Spread.Sheets.ImportXlsxOptions GC.Spread.Sheets.ExportXlsxOptions GC.Spread.Sheets.ImportCsvOptions .Spread.Sheets.ExportCsvOptions GC.Spread.Sheets.ImportSSJsonOptions GC.Spread.Sheets.ExportSSJsonOptions
var openOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{ name: 'normal', value: 0 }, { name: 'lazy', value: 1 }, { name: 'incremental', value: 2 }], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, ]; var importXlsxOptions = [ { propName: "openMode", type: "select", displayText: "OpenMode", options: [{ name: 'normal', value: 0 }, { name: 'lazy', value: 1 }, { name: 'incremental', value: 2 }], default: 0 }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "dynamicReferences", type: "boolean", default: true }, { propName: "calcOnDemand", type: "boolean", default: false }, { propName: "includeUnusedStyles", type: "boolean", default: true }, ]; var importSSJsonOptions = [ { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "frozenColumnsAsRowHeaders", type: "boolean", default: false }, { propName: "frozenRowsAsColumnHeaders", type: "boolean", default: false }, { propName: "fullRecalc", type: "boolean", default: false }, { propName: "incrementalLoading", type: "boolean", default: false } ]; var importCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," } ]; var saveOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeCalcModelCache", type: "boolean", default: false }, { propName: "saveR1C1Formula", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportXlsxOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, { propName: "includeUnusedNames", type: "boolean", default: true }, { propName: "includeEmptyRegionCells", type: "boolean", default: true }, ]; var exportSSJsonOptions = [ { propName: "includeBindingSource", type: "boolean", default: false }, { propName: "includeStyles", type: "boolean", default: true }, { propName: "includeFormulas", type: "boolean", default: true }, { propName: "saveAsView", type: "boolean", default: false }, { propName: "rowHeadersAsFrozenColumns", type: "boolean", default: false }, { propName: "columnHeadersAsFrozenRows", type: "boolean", default: false }, { propName: "includeAutoMergedCells", type: "boolean", default: false }, ]; var exportCsvOptions = [ { propName: "encoding", type: "string", default: "UTF-8" }, { propName: "rowDelimiter", type: "string", default: "\r\n" }, { propName: "columnDelimiter", type: "string", default: "," }, { propName: "sheetIndex", type: "number", default: 0 }, { propName: "row", type: "number", default: 0 }, { propName: "column", type: "number", default: 0 }, { propName: "rowCount", type: "number", default: 200 }, { propName: "columnCount", type: "number", default: 20 }, ]; var FileType = { SJS: 'sjs', Excel: 'xlsx', SSJson: 'ssjson', Csv: 'csv', } var openOptionsDict = {}; openOptionsDict[FileType.SJS] = openOptions; openOptionsDict[FileType.Excel] = importXlsxOptions; openOptionsDict[FileType.SSJson] = importSSJsonOptions; openOptionsDict[FileType.Csv] = importCsvOptions; var saveOptionsDict = {}; saveOptionsDict[FileType.SJS] = saveOptions; saveOptionsDict[FileType.Excel] = exportXlsxOptions; saveOptionsDict[FileType.SSJson] = exportSSJsonOptions; saveOptionsDict[FileType.Csv] = exportCsvOptions; window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss")); var statusBar = new GC.Spread.Sheets.StatusBar.StatusBar(document.getElementById('statusBar')); statusBar.bind(spread); initDefaultOptions(); var selectedFileElement = document.querySelector('#selectedFile'); selectedFileElement.addEventListener("change", function () { var file = selectedFileElement.files[0]; updateOptions('open', getFileType(file)); }); var saveFileType = document.querySelector('#saveFileType'); saveFileType.addEventListener("change", function () { var fileType = saveFileType.value; updateOptions('save', fileType); }); document.getElementById('open').onclick = function () { var file = document.querySelector('#selectedFile').files[0]; if (!file) { return; } var fileType = getFileType(file); var options = getOptions('open'); if (fileType === FileType.SJS) { spread.open(file, function () { }, function () { }, options); } else { spread.import(file, function () { }, function () { }, options); } }; document.getElementById('save').onclick = function () { var fileName = 'export.' + saveFileType.value; var fileType = saveFileType.value; var options = getOptions('save'); if (fileType === FileType.SJS) { spread.save(function (blob) { saveAs(blob, fileName); }, function () { }, options); } else { options.fileType = mapExportFileType(fileType); spread.export(function (blob) { saveAs(blob, fileName); }, function () { }, options); } }; }; function initOptions(options, fileType, mode) { var container = document.createElement('div'); container.className = fileType; container.style.display = 'none'; options.forEach(function (prop) { var item = document.createElement('div'); item.className = 'item'; var id = getElementId(mode, fileType, prop.propName); var label = document.createElement("label"); label.innerText = prop.displayText || prop.propName; label.for = id; if (prop.type === 'select') { var select = document.createElement('select'); prop.options.forEach(function (p) { var option = document.createElement('option'); option.value = p.value; option.text = p.name; select.appendChild(option); }); select.id = id; select.value = prop.default; item.appendChild(label); item.appendChild(select); } else { var input = document.createElement('input'); input.id = getElementId(mode, fileType, prop.propName); if (prop.type === 'boolean') { input.type = 'checkbox'; input.checked = prop.default; item.appendChild(input); item.appendChild(label); } else if (prop.type === 'number') { input.type = 'number'; input.value = prop.default; item.appendChild(label); item.appendChild(input); } else if (prop.type === 'string') { input.type = 'text'; input.value = prop.default; item.appendChild(label); item.appendChild(input); } } container.appendChild(item); }); return container; } function initDefaultOptions() { var container = document.querySelector('.open-options'); var mode = 'open'; container.appendChild(initOptions(openOptions, FileType.SJS, mode)); container.appendChild(initOptions(importXlsxOptions, FileType.Excel, mode)); container.appendChild(initOptions(importSSJsonOptions, FileType.SSJson, mode)); container.appendChild(initOptions(importCsvOptions, FileType.Csv, mode)); container = document.querySelector('.save-options'); mode = 'save'; container.appendChild(initOptions(saveOptions, FileType.SJS, mode)); container.appendChild(initOptions(exportXlsxOptions, FileType.Excel, mode)); container.appendChild(initOptions(exportSSJsonOptions, FileType.SSJson, mode)); container.appendChild(initOptions(exportCsvOptions, FileType.Csv, mode)); updateOptions('save', FileType.SJS); } function updateOptions(mode, fileType) { var container = document.querySelector('.' + mode + '-options'); var oldFileType = container.getAttribute('data-file-type'); if (oldFileType === fileType) { return; } if (oldFileType) { container.querySelector('.' + oldFileType).style.display = 'none'; } if (fileType) { container.querySelector('.' + fileType).style.display = ''; } container.setAttribute('data-file-type', fileType); } function getOptions(mode) { var container = document.querySelector('.' + mode + '-options'); var fileType = container.getAttribute('data-file-type'); if (!fileType) { return; } var options = {}; var props = mode === 'open' ? openOptionsDict[fileType] : saveOptionsDict[fileType]; container = container.querySelector('.' + fileType); props.forEach(function (prop) { var element = container.querySelector('#' + getElementId(mode, fileType, prop.propName)); var value; if (prop.type === 'boolean') { value = element.checked; } else if (prop.type === 'number') { value = +element.value; } else if (prop.type === 'string') { value = element.value; } else if (prop.type === 'select') { value = +element.value; } options[prop.propName] = value; }); return options; } function getElementId(mode, fileType, propName) { return mode + '-' + fileType + '-' + propName; } function getFileType(file) { if (!file) { return; } var fileName = file.name; var extensionName = fileName.substring(fileName.lastIndexOf(".") + 1); if (extensionName === 'sjs') { return FileType.SJS; } else if (extensionName === 'xlsx' || extensionName === 'xlsm') { return FileType.Excel; } else if (extensionName === 'ssjson' || extensionName === 'json') { return FileType.SSJson; } else if (extensionName === 'csv') { return FileType.Csv; } } function mapExportFileType(fileType) { if (fileType === FileType.SSJson) { return GC.Spread.Sheets.FileType.ssjson; } else if (fileType === FileType.Csv) { return GC.Spread.Sheets.FileType.csv; } return GC.Spread.Sheets.FileType.excel; }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ja-jp" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ja/purejs/node_modules/@mescius/spread-sheets-resources-ja/dist/gc.spread.sheets.resources.ja.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/FileSaver.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div class="sample-container"> <div id="ss" class="sample-spreadsheets"></div> <div id="statusBar"></div> </div> <div class="options-container"> <div class="option-row"> <div class="inputContainer"> <input id="selectedFile" type="file" name="files[]" accept=".sjs, .xlsx, .xlsm, .ssjson, .json, .csv" /> <button class="settingButton" id="open">開く</button> <div class="open-options"></div> </div> <div class="inputContainer"> <label for="fileType">ファイル形式:</label> <select id="saveFileType"> <option value="sjs">SJS</option> <option value="xlsx">Excel</option> <option value="ssjson">SSJson</option> <option value="csv">Csv</option> </select> <button class="settingButton" id="save">保存</button> <div class="save-options"></div> </div> </div> </div> </div> </body> </html>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-container { width: calc(100% - 280px); height: 100%; float: left; } .sample-spreadsheets { width: 100%; height: calc(100% - 25px); overflow: hidden; } #statusBar { bottom: 0; height: 25px; width: 100%; position: relative; } .options-container { float: right; width: 280px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .sample-options { z-index: 1000; } .inputContainer { width: 100%; height: auto; border: 1px solid #eee; padding: 6px 12px; margin-bottom: 10px; box-sizing: border-box; } .settingButton { color: #fff; background: #82bc00; outline: 0; line-height: 1.5715; position: relative; display: inline-block; font-weight: 400; white-space: nowrap; text-align: center; height: 32px; padding: 4px 15px; font-size: 14px; border-radius: 2px; user-select: none; cursor: pointer; border: 1px solid #82bc00; box-sizing: border-box; margin-bottom: 10px; margin-top: 10px; } .settingButton:hover { color: #fff; border-color: #88b031; background: #88b031; } .options-title { font-weight: bold; margin: 4px 2px; } #selectedFile { width: 180px; } #saveFileType { width: 120px; height: 31px; } .open-options .item { margin: 5px 0px; display: flex; } .save-options .item { margin: 5px 0px; display: flex; } label { margin-left: 3px; } select, input[type="text"], input[type="number"] { display: inline-block; margin-left: auto; width: 120px; font-weight: 400; outline: 0; line-height: 1.5715; border-radius: 2px; border: 1px solid #F4F8EB; box-sizing: border-box; }