今回ご紹介する Infragistics Ignite UI の Excel ライブラリは、javascript を使用してクライアントサイドのみで Excel ファイルの作成や保存を行う機能を持っています。
簡単な Excel テンプレートの作成や保存、読み込みと編集の例を通して、ライブラリの実力をご覧ください。
それでは、まずは Excel を新規で作成してみましょう。
以下の一文は新しい workbook インスタンスを生成します。
//workbookインスタンスを2007(.xlsx)ファイル形式で生成する var newWorkbook = new $.ig.excel.Workbook( $.ig.excel.WorkbookFormat.excel2007 );
この状態では newWorkbook は空のワークブックです。ワークシートを追加しましょう。
//新規ワークシートを追加する
var worksheet1 = newWorkbook.worksheets().add("NewSheet1");
空のワークシート "NewSheet1" が追加されました。
次に、このシートにテンプレートを作成します。
Microsoft Excel で開くとこのように表示されるテンプレートを作りたいと思います。
C、D、E列のセルには書式を設定し、数値が入力された場合は貨幣マークの入った金額の形式で表示されるようにします。また、合計セルにはA~D支店の合計値が表示されるよう、SUM 関数を設定します。
以下は上記テンプレートを作成するためのコードです。
//罫線を設定
for (var i = 1; i <= 6; i++ )
{
for (var j = 1; j <= 4; j++)
{
worksheet1.rows(i).cells(j).cellFormat().rightBorderStyle($.ig.excel.CellBorderLineStyle.thin);
worksheet1.rows(i).cells(j).cellFormat().bottomBorderStyle($.ig.excel.CellBorderLineStyle.thin);
}
}
//セルに文字列を書き込む
worksheet1.getCell("C2").value("1月");
worksheet1.getCell("D2").value("2月");
worksheet1.getCell("E2").value("3月");
worksheet1.getCell("B3").value("A支店");
worksheet1.getCell("B4").value("B支店");
worksheet1.getCell("B5").value("C支店");
worksheet1.getCell("B6").value("D支店");
worksheet1.getCell("B7").value("合計");
//セルに背景色を設定する
var bgPink = $.ig.excel.CellFill.createSolidFill("#FF99CC");
var bgBlue = $.ig.excel.CellFill.createSolidFill("#CCFFFF");
worksheet1.getCell("C2").cellFormat().fill(bgPink);
worksheet1.getCell("D2").cellFormat().fill(bgPink);
worksheet1.getCell("E2").cellFormat().fill(bgPink);
worksheet1.getCell("B3").cellFormat().fill(bgBlue);
worksheet1.getCell("B4").cellFormat().fill(bgBlue);
worksheet1.getCell("B5").cellFormat().fill(bgBlue);
worksheet1.getCell("B6").cellFormat().fill(bgBlue);
//セルに関数を設定する
worksheet1.getCell("C7").applyFormula("=Sum(C3:C6)");
worksheet1.getCell("D7").applyFormula("=Sum(D3:D6)");
worksheet1.getCell("E7").applyFormula("=Sum(E3:E6)");
//C,D,E列に書式を設定する
worksheet1.columns(2).cellFormat().formatString("\"¥\"#,##0;[Red]\"¥\"\\-#,##0");
worksheet1.columns(3).cellFormat().formatString("\"¥\"#,##0;[Red]\"¥\"\\-#,##0");
worksheet1.columns(4).cellFormat().formatString("\"¥\"#,##0;[Red]\"¥\"\\-#,##0");
//数式の再計算を手動モードにする
newWorkbook.calculationMode($.ig.excel.CalculationMode.manual);
これでテンプレートが完成しました。
次に、ig.excel.Workbook クラスの save() メソッドを使用してこの workbook インスタンスを Excel ファイルとして保存しましょう。保存のためのファンクションを以下のように定義しました。
function saveWorkbook(workbookToSave, fileName)
{
workbookToSave.save({ type: 'blob' },
function (data) {
saveAs(data, fileName);
},
function (error) {
}
);
}
第一引数の workbookToSave は workbook インスタンス、第二引数は保存時のデフォルトのファイル名です。
先ほどテンプレートを作成した newWorkbook を保存するには、以下を実行します。
//workbookインスタンスをExcelファイルに書き出す saveWorkbook(newWorkbook, "template.xlsx");
ローカルマシンに Excel のテンプレートファイルを保存いただけたことと思います。
続きまして、今度は逆に Excel のファイルをプログラム上に取り込んでみます。これには、ig.excel.Workbook クラスの load() メソッドを使用します。
まず、ユーザーがファイルを選択できるよう、html に input タグ (type=”file”) を追加します。accept 属性には、Excel ファイルのみリストアップされるようにタイプの指定を行います。
<input type="file" id="input" accept="application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
上記 input でファイルが選択された際に発生する change イベントを利用して Excel ファイルから workbook インスタンスを生成し、変数に保管します。
var myWorkbook;
$("#input").on("change", function () {
var excelFile;
var fileReader = new FileReader();
if (this.files.length > 0) {
excelFile = this.files[0];
if (excelFile.type === "application/vnd.ms-excel" ||
excelFile.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
(excelFile.type === "" && (excelFile.name.endsWith("xls") || excelFile.name.endsWith("xlsx")))) {
fileReader.readAsArrayBuffer(excelFile);
}
}
fileReader.onload = function (e) {
var buffer = new Uint8Array(fileReader.result);
//選択されたExcelファイルを読み込み、workbookインスタンスを生成する
$.ig.excel.Workbook.load(buffer,
function (wb) {
myWorkbook = wb;
},
function (error) {
}
);
}
});
これでユーザーが選択した Excel ファイルを変数 myWorkbook に取り込むことができます。
試しに、初めに作成したテンプレートファイル template.xlsx を上記を使ってプログラムに取り込んでみてください。
今度は取り込んだ myWorkbook のテンプレートに実際にデータを書き込んでみます。
var worksheet1 = myWorkbook.worksheets(0); //セルにデータを書き込む //A支店 worksheet1.rows(2).cells(2).value(1234); worksheet1.rows(2).cells(3).value(2413); worksheet1.rows(2).cells(4).value(823); //B支店 worksheet1.rows(3).cells(2).value(-314); worksheet1.rows(3).cells(3).value(14); worksheet1.rows(3).cells(4).value(-21); //C支店 worksheet1.rows(4).cells(2).value(432); worksheet1.rows(4).cells(3).value(124); worksheet1.rows(4).cells(4).value(62); //D支店 worksheet1.rows(5).cells(2).value(63251); worksheet1.rows(5).cells(3).value(43545); worksheet1.rows(5).cells(4).value(45266); //数式の再計算を行う myWorkbook.recalculate(true);
データを書き込んだワークブックは先ほど定義した saveWorkbook() を使って新たな名前で保存することができます。
//workbookインスタンスをExcelファイルに書き出す saveWorkbook(myWorkbook, "data1.xlsx");
このように保存されました。
テンプレート作成時に設定しておいたセルの書式、そして SUM 関数が機能していることをご確認ください。
今回はここにもう少しだけ編集を加えてみます。
追加されたデータを見ますと、こちらの企業ではB支店の業績が芳しくないようです。ig.excel.WorksheetRowCollectionのremove() メソッドを使用して、B支店の業績を削除してしまいましょう。さらに、同じく insert() メソッドを使用してタイトル行を追加してみます。
var worksheet1 = myWorkbook.worksheets(0);
//B支店行を削除
worksheet1.rows().remove(3);
//タイトル行を追加
worksheet1.rows().insert(1);
//セルを結合してタイトルを書き込む
var mergedRegion1 = worksheet1.mergedCellsRegions().add(1, 1, 1, 4);
mergedRegion1.value("営業実績");
worksheet1.rows(1).cells(1).cellFormat().alignment($.ig.excel.HorizontalCellAlignment.center);
//数式の再計算を行う
myWorkbook.recalculate(true);
saveWorkbook() で保存しますと、このような Excel が出来上がりました。
タイトル行が加わり、B支店が削除されました。合計欄は再計算されています。
Ignite UI の Excel ライブラリの使用例をご紹介しました。
今回のサンプルはこちらから。
(本サンプルは16.1バージョンで作成されました)