-
今回は PHPExcel で行う 「ワークシートの扱い方」 について説明したいと思います。
■PHPExcel オブジェクトの生成と ワークシート の取得
PHPExcel オブジェクトを生成を行うと1個の ワークシート ができているので、その ワークシート・オブジェクト を取得し、 そのオブジェクトの各種メソッドでセルなどに処理を行います。
getActiveSheet メソッドは現在のアクティブなワークシート返しますが PHPExcel オブジェクトを生成直後は1個しかないシートがアクティブとして返されます。
以下のページと内容は同じですので、参照して下さい。
⇒PHP エクセルファイル出力の方法について(PHPExcel)
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test.xlsx'); exit(); ?>getSheet メソッドは引数にワークシートの Index 指定を指定しますが、指定が無ければ先頭の Index のシートが返されます。 ワークシートの Index ではなく名前で指定するには getSheetByName メソッドを使用します。
// シート設定:ワークシートの Index 指定 $objSheet = $objBook->getSheet(0); // シート設定:ワークシートの Index 指定無し(Index = 0 と同様) $objSheet = $objBook->getSheet(); // シート設定:ワークシートの名前指定 $objSheet = $objBook->getSheetByName('Worksheet');■新規 ワークシート の追加処理
新規の ワークシート をブックに追加する場合には createSheet と addSheet のメソッドを使います。
createSheet メソッドは引数の無い場合はシートの最後に追加されます。引数はシートの Index で指定された場合はその位置に挿入されます。
addSheet メソッドは指定されたシートオブジェクトを Index で指定された場合はその位置に挿入されます。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // (1)シート追加 $objBook->createSheet(); // (2)シート追加:シート位置 Index 指定(Index = 0 :ブックの先頭) $objBook->createSheet(0); // 新規ワークシートを生成 $objSheetMyData = new PHPExcel_Worksheet($objBook, 'MyData'); // (3)[MyData]ワークシートをブックの先頭に追加 $objBook->addSheet($objSheetMyData, 0); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test2.xlsx'); exit(); ?>出力されたエクセルファイルを見てみると以下の様になります。
このワークブックには必ず4個のワークシートが生成されています。
[Worksheet] は最初のPHPExcelオブジェクト作成後は必ず存在します。その後順番に以下の様になります。
(1) [Worksheet 1]はシートの最後に追加されます。
(2) [Worksheet 2]は先頭のシート([Worksheet])の前に追加されます。
(3) [MyData]は先頭のシート([Worksheet 2])の前に追加されます。
■ワークシート のコピー処理
ワークブックの中のコピーしたいワークシートのクローンを生成し、そのオブジェクトをワークブックに追加することでコピー処理となります。
ワークブックへの追加は addSheet メソッドを使用します。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [A2]セルに数値設定 $objSheet->setCellValue('A2', 123.56); // 0 番目のワークシート・オブジェクトのクローンを作成 $objCloneSheet = clone $objBook->getSheet(0); // クローンワークシートのタイトル設定 $objCloneSheet->setTitle('Copy Worksheet 1'); // ワークブックへの追加 $objBook->addSheet($objCloneSheet); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3.xlsx'); ?>出力されたエクセルファイルを見てみると以下の様になります。
他のワークブックからのコピーを行う場合は、そのワークブックの該当するワークシートのクローンを生成し addExternalSheet メソッドで行います。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test3.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objBook = PHPExcel_IOFactory::load('./test3.xlsx'); // PHPExcelオブジェクト作成 $objBookNew = new PHPExcel(); // シート設定 $objSheetNew = $objBookNew->getActiveSheet(); // [A1]セルに文字列設定 $objSheetNew->setCellValue('A1', 'abcdefghijklmn'); // [test3.xlsx]:[Copy Worksheet 1] シートのクローンを作成 $objCloneSheet = clone $objBook->getSheetByName('Copy Worksheet 1'); // ワークブックへの追加 $objBookNew->addExternalSheet($objCloneSheet); // 追加後のブックでのシート取得 $objSheet = $objBookNew->getSheetByName('Copy Worksheet 1'); // クローンワークシートのタイトル再設定 $objSheet->setTitle('New Worksheet 1'); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBookNew, "Excel2007"); $objWriter->save('test3-1.xlsx'); exit(); ?>出力されたエクセルファイル[test3-1.xlsx]を見てみると以下の様になります。
■ワークシート の削除処理
ワークブックからワークシートの削除を行うには、削除対象のワークシートの Index 番号を取得し removeSheetByIndex メソッドで行います。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test3-1.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objBook = PHPExcel_IOFactory::load('./test3-1.xlsx'); // シート名 "Worksheet" シート設定 $objSheet = $objBook->getSheetByName('Worksheet'); // シートオブジェクトから Index 取得 $intIndex = $objBook->getIndex($objSheet); // Index によるシートオブジェクト削除 $objBook->removeSheetByIndex($intIndex); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test3-2.xlsx'); exit(); ?>出力されたエクセルファイル[test3-2.xlsx]を見てみると以下の様になります。[test3-1.xlsx] の先頭のシートが削除されているのがわかります。
PR -
今回は PHPExcel で行う 「エクセルファイル出力」 について説明したいと思います。
このライブラリですが少し前のもので現在は更新が止まっていまして PhpSpreadsheet を使う様に推奨されています。 ただ、以前のプログラムのメンテ等もあると思いますので、まだまだ使われているのではないでしょうか。
(PHPExcel の使用の説明が終わった後で PhpSpreadsheet の記事を載せたいと思います)
- PHPExcel のダウンロードとインストール
- 簡単なエクセルファイルの登録処理(ローカルフォルダ)
- 簡単なエクセルファイルのダウンロード処理
- ローカルのエクセルファイルを読込み、データ追加後の登録処理
■PHPExcel のダウンロードとインストール
PHPExcel のダウンロードは以下の所から行えます。
【GitHub】PHPOffice / PHPExcel
⇒https://github.com/PHPOffice/PHPExcelClone or download ボタンをクリックし更に Download ZIP をクリックででダウンロードが開始されます。
以下の様に HTML ドキュメントのフォルダに展開します。 私のテスト環境はWindows上の xampp で行いますので C:\xampp\htdocs\ フォルダの中に _phpexcel フォルダを作成し PHPExcel-1.8.zip を展開しました。■簡単なエクセルファイルの登録処理(ローカルフォルダ)
簡単なエクセルファイルの登録処理として、エクセルの先頭セルに 'ABCDEFG' の文字列を設定し、エクセルファイルをローカルフォルダに書込みます。 手順としては以下の様になります。
- PHPExcel ライブラリの読込
- PHPExcel オブジェクトの生成
- エクセルのシートを取得し、先頭セルへの値設定
- エクセルのファイル形式を指定し登録
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [A2]セルに数値設定 $objSheet->setCellValue('A2', 123.56); // [A3]セルにBoolean値設定 $objSheet->setCellValue('A3', TRUE); // [A4]セルに書式設定 $objSheet->setCellValue('A4', '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test.xlsx'); exit(); ?>new PHPExcel(); でPHPExcelオブジェクトの作成の結果として新規のワークブックが生成されます。
このワークブックには必ず1個のワークシートが生成されています。
ワークシートは1個しかないので、アクティブなワークシートはその1個のワークシートが該当します。
よって getActiveSheet() メソッドでシートオブジェクトを取得します。 (getSheet(pIndex) メソッドでも同じことが出来ます。引数 pIndex は「0」からのワークシートのIndexです。)
後は、ワークシートオブジェクトの setCellValue() メソッドで文字列、数値、Boolean値、書式の設定を行います。
最後にエクセルファイルを保存するのですが PHPExcel_IOFactory クラスの静的メソッドの createWriter を使って PHPExcel_Writer_IWriter オブジェクトを生成します。 PHPExcel_Writer_IWriter オブジェクトの唯一のメソッド save で保存します。保存結果は以下の様になります。ワークシートオブジェクトの getCell() メソッドでセルオブジェクトを取得し、 セルオブジェクトの setValue() メソッドを使って以下の様にすることもできます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getSheet(0); // [A1]セルに文字列設定 $objSheet->getCell('A1')->setValue('ABCDEFG'); // [A2]セルに数値設定 $objSheet->getCell('A2')->setValue('123.56'); // [A3]セルにBOOLEAN設定 $objSheet->getCell('A3')->setValue(TRUE); // [A4]セルに書式設定 $objSheet->getCell('A4')->setValue('=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'); // Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test1-2.xlsx'); exit(); ?>■簡単なエクセルファイルのダウンロード処理
上の例ではローカルのフォルダーにエクセルファイルを保存しましたが、PHPのプログラムから直接ブラウザに対して送信する方法があります。 手順としては以下の様になります。
- PHPExcel でシートデータを作成する
- 出力するドキュメントタイプをHTTPヘッダーでブラウザに送信する
- PHPExcel_Writer_IWriterで“php://output”に出力する
上記のソースを以下の様に変更します。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A1]セルに文字列設定 $objSheet->setCellValue('A1', 'ABCDEFG'); // [A2]セルに数値設定 $objSheet->setCellValue('A2', 123.56); // [A3]セルにBOOLEAN設定 $objSheet->setCellValue('A3', TRUE); // [A4]セルに書式設定 $objSheet->setCellValue('A4', '=IF(A3, CONCATENATE(A1, " ", A2), CONCATENATE(A2, " ", A1))'); // ブラウザへの指定 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="test.xlsx"'); header('Cache-Control: max-age=0'); // Excel2007形式で出力 $objWriter = PHPExcel_IOFactory::createWriter($objBook, 'Excel2007'); $objWriter->save('php://output'); ?>
この処理は注意する点があるのですが、エクセル出力を行う前までに、ブラウザに対して表示出力を行うとダウンロード処理がうまくいきません。 PHP開始タグ <?php のタグの前に空白を入れず、PHP終了タグ ?> の後に最大で1つの改行を入れます。
■ローカルのエクセルファイルを読込み、データ追加後の登録処理
これまでは新規にエクセルファイルを作成する処理でしたが、サーバ側のローカルフォルダに存在するエクセルファイルを読込み、 その後データを追加する処理を説明します。
new PHPExcel(); でPHPExcelオブジェクトの作成している部分を PHPExcel_IOFactory クラスの静的メソッドの load を使ってエクセルファイルを読込み PHPExcelオブジェクト を生成します。
尚、ブラウザに対してファイル名にシステム日付と時刻を付加して返しています。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // [test.xlsx] ファイルをロードしPHPExcelオブジェクト作成 $objBook = PHPExcel_IOFactory::load('./test.xlsx'); // シート設定 $objSheet = $objBook->getActiveSheet(); // [A5]セルに文字列設定 $objSheet->setCellValue('A5', 'abcdefghijk'); // ブラウザへの指定 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="test'.date("Y-m-d_His").'.xlsx"'); header('Cache-Control: max-age=0'); // Excel2007形式で出力 $objWriter = PHPExcel_IOFactory::createWriter($objBook, 'Excel2007'); $objWriter->save('php://output'); ?>FireFox でのダウンロードの表示は以下の通りです。
この方法は、テンプレートファイルを作成しておきクライアント側からの要求により対応するデータを設定し、 クライアントのブラウザに出力するといったことに使えると思います。
-
今回は JavaScript で行う 「ファイルのダウンロード処理」 について説明したいと思います。
「ファイルのダウンロード処理」 は PDF ファイル や テキストファイル および EXCEL ファイル などをユーザにダウンロードさせたいときに行います。
- HTMLタグのみでダウンロード
- HTMLタグをJavaScriptの処理に変更
- JavaScriptのXMLHttpRequestオブジェクトを使った処理に変更
- IE(Internet Explorer), Eageへの対処方法
■HTMLタグのみでダウンロード
HTMLタグ のみの記述でダウンロードを挿せる方法を説明します。
a タグ (a 要素、アンカータグ) に download 属性が有りますのでそれを記入します。
以下に zipファイル、画像ファイル(.png)、PDFファイル のダウンロードを行う HTML を示します。
(zipファイル は download の指定が無くてもOKな様です)<html> <head> <meta charset="utf-8"> <title>test download</title> </head> <body> <h2>test download</h2> <p> <a href="./test.zip">[test.zip]ファイルをダウンロード</a> <br /> <a href="./test.png" download>[test.png]ファイルをダウンロード</a> <br /> <a href="./test.pdf" download="TEST1.PDF">[test.pdf]ファイルをダウンロード</a> </p> <br /> </body> </html>download 属性の値にファイル名を設定すると、ダウンロード時にローカルのファイル名がそれになります。
■HTMLタグをJavaScriptの処理に変更
a タグ の処理を JavaScript の処理に置き変えたものが以下の HTML です。
<html> <head> <meta charset="utf-8"> <title>test download</title> <script type="text/javascript"> function doDownload(url, filename) { // a タグ生成 var alink = document.createElement('a'); alink.download = filename; // [download] のファイル名 alink.href = url; // サーバのファイルのURL alink.click(); // クリック実行 return false; } </script> </head> <body> <h2>test download</h2> <p> <button onclick="doDownload('./test.zip', 'test.zip');"> [test.zip]ファイルをダウンロード </button> <br /> <button onclick="doDownload('./test.png', 'test.png');"> [test.png]ファイルをダウンロード </button> <br /> <button onclick="doDownload('./test.pdf', 'TEST1.PDF');"> [test.pdf]ファイルをダウンロード </button> </p> <br /> </body> </html>■JavaScriptのXMLHttpRequestオブジェクトを使った処理に変更
XMLHttpRequestオブジェクト は JavaScript で HTTP リクエストを行うための組み込みのブラウザオブジェクトです。 名前の先頭に XML と付いていますが XML形式だけでなく各種のデータを扱うことができるため、ファイルのダウンロードに利用できます。
上記の doDownload 関数を以下の様にして行います。function doDownload(url, filename) { // XMLHttpRequestオブジェクト作成 var objXML = new XMLHttpRequest(); objXML.open("GET", url, true); // ダウンロードがblobオブジェクトの指定 objXML.responseType = "blob"; // ダウンロード完了時の処理関数 objXML.onload = function (oEvent) { // blobオブジェクト var objBlob = objXML.response; // blobオブジェクトを指すURLオブジェクト var objURL = window.URL.createObjectURL(objBlob); // リンクを生成し、JavaScriptからクリック var objLink = document.createElement("a"); document.body.appendChild(objLink); objLink.href = objURL; objLink.download = filename; objLink.click(); }; // XMLHttpRequestオブジェクトの通信開始 objXML.send(); }
XML オブジェクトのダウンロード完了時のイベントである onload で受け取った blob データを window.URL.createObjectURL により指定された内容を参照するために使用されるオブジェクトURLが返されるので、 それをリンクタグに設定し仮想的にクリック処理を行います。
ただこの関数は FireFox Chrome は動作しますが IE, Edge では動作しません。
objLink.click(); のところで「アクセスが拒否されました」となって処理ができません。
IE, Edge には navigator.msSaveBlob メソッドを使うと blob データをファイルに登録できる様です。
■IE(Internet Explorer), Eageへの対処方法
以下の関数は、ダウンロード処理時に navigator.msSaveBlob メソッドが存在するかを確認して、 存在する場合にはそのメソッドを使用して処理を行う様に変更しました。
function doDownload(url, filename) { // XMLHttpRequestオブジェクト作成 var objXML = new XMLHttpRequest(); objXML.open("GET", url, true); // ダウンロードがblobオブジェクトの指定 objXML.responseType = "blob"; // ダウンロード完了時の処理関数 objXML.onload = function (oEvent) { // blobオブジェクト var objBlob = objXML.response; if (window.navigator.msSaveBlob) { // IE, Edge window.navigator.msSaveBlob(objBlob, filename); } else { // blobオブジェクトを指すURLオブジェクト var objURL = window.URL.createObjectURL(objBlob); // リンクを生成し、JavaScriptからクリック var objLink = document.createElement("a"); document.body.appendChild(objLink); objLink.href = objURL; objLink.download = filename; objLink.click(); //window.URL.revokeObjectURL(file); } }; // XMLHttpRequestオブジェクトの通信を開始する objXML.send(); }
-
前回の以下のページのでは「ID」と「対象」のカラム上でもコピーができる様になっていましたが、実際このカラムはコピー処理が必要無いため コピー開始時にエラーで処理しない様に変更します。
⇒JavaScript jQuery w2ui.grid を使ったグリッド処理・セルの編集設定2(editable, selectType, onCopy, onPaste)
キー入力を制御するために onKeydown イベントを追加します。
尚、ranges プロパティについては「ranges プロパティについて補足説明」を参照して下さい。■onKeydownイベント処理
onKeydown: function(event) { } <引数> ・event:イベント情報が含まれたオブジェクト ・event.text:コピーされたデータがテキストで格納(セル毎は"\t"で、1行が"\n"の区切り記号) onPaste: function(event) { } <引数> ・event:イベント情報が含まれたオブジェクト ・event.column:ペーストするカラム位置 ・event.index :ペーストする行位置 ・event.text :コピーされたデータがテキストで格納(セル毎は"\t"で、1行が"\n"の区切り記号) ※<イベントハンドラの指定> function (event) { // 処理の記述 } <デフォルトの動作をキャンセルする場合> function (event) { event.preventDefault(); // イベント・キャンセル }
■コピー&ペーストイベントを加味した処理
<!DOCTYPE html> <html> <head> <title>w2ui Grid - editable</title> <meta charset="utf-8" /> <link rel="stylesheet" type="text/css" media="screen" href="./dist/w2ui.min.css" /> <script type="text/javascript" src="./libs/jquery/jquery-2.1.4.min.js"></script> <script type="text/javascript" src="./dist/w2ui.js"></script> </head> <body> <div id="grid" style="width: 600px; height: 240px;"></div> <br> <button class="w2ui-btn" onclick="showChanged()">変更データ表示</button> <script> // コピーカラム位置 var nCopyColumn = -1; // 性別データ var arrSex = [ {id:1, text:"男性"}, {id:2, text:"女性"} ]; $(function () { // id="grid" へのグリッド設定 $('#grid').w2grid({ name: 'grid', selectType: "cell", columns: [ { field: 'recid' , caption: 'ID' , size: '50px' , attr: "align=center", frozen: true }, { field: 'check' , caption: '対象' , size: '60px' , editable: { type:"checkbox" } }, { field: 'name' , caption: '名前' , size: '100px' , editable: { type:"text" } }, { field: 'age' , caption: '年齢' , size: '60px' , editable: { type:"int", min: 10, max: 99 } }, { field: 'sex' , caption: '性別' , size: '100px' , editable: { type:"select", items: arrSex } , render: function (record, index, col_index) { var html = ''; for (var idx in arrSex) { if (arrSex[idx].id == this.getCellValue(index, col_index)) { html = arrSex[idx].text; } } return html; } }, { field: 'birth' , caption: '生年月日', size: '100px' , render: 'date:yyyy/mm/dd', editable: { type:"date", format: "yyyy/mm/dd" } }, { field: "height", caption: "身長" , size: "50px" , render : "float:1", editable: { type:"float", min: 1, max: 999.9 } }, { field: "weight", caption: "体重" , size: "50px" , render : "float:1", editable: { type:"float", min: 1, max: 999.9 } } ], onKeydown: function(event) { // セルでのKeyDownイベント // [Ctrl] + [c] でのコピー処理 if (event.originalEvent.ctrlKey && event.originalEvent.keyCode == 0x43) { var rng = this.ranges[0]; if (rng.range[0].column <= 1) { // 「ID」「対象」の場合 Copy 処理をキャンセル alert("コピー範囲に「ID」「対象」を含むため、コピー処理をキャンセルします。"); return; } // Copy Paste のカラム位置退避 nCopyColumn = rng.range[0].column; return; } // メタキー、Ctrlキー、altキーは処理無し if (event.metaKey || event.ctrlKey || event.altKey){ return; } }, onCopy: function(event) { // コピーイベント var rng = this.ranges[0]; if (nCopyColumn == -1) { nCopyColumn = rng.range[0].column; //Copy Paste のカラム位置退避 } // 性別カラムの補正 var strRow = "" + event.text; strRow = strRow.replace(/男性/g, "1"); strRow = strRow.replace(/女性/g, "2"); event.text = strRow; }, onPaste: function(event) { // ペーストイベント if (nCopyColumn == -1) { alert("コピーが行われていません。"); // ペースト処理をキャンセル event.preventDefault(); return; } if (nCopyColumn != event.column) { alert("コピー&ペーストは同じカラム位置で行って下さい。"); // ペースト処理をキャンセル event.preventDefault(); return; } //Copy Paste のカラム位置クリア nCopyColumn = -1; }, records: [ { recid:1, check:true , name:"田中太郎", age:"35", sex:"1", birth:"1985/03/01", height:"170.1", weight:"48.5" }, { recid:2, check:true , name:"田中花子", age:"30", sex:"2", birth:"1990/03/12", height:"160.0", weight:"45.0" }, { recid:3, check:true , name:"山田一郎", age:"20", sex:"1", birth:"2000/03/13", height:"165.1", weight:"58.5" }, { recid:4, check:false, name:"山田二郎", age:"18", sex:"1", birth:"2002/03/24", height:"172.5", weight:"68.2" }, { recid:5, check:true , name:"山田良子", age:"25", sex:"2", birth:"1995/03/25", height:"158.0", weight:"47.0" }, { recid:6, check:false, name:"山本桃子", age:"40", sex:"2", birth:"1980/03/26", height:"162.2", weight:"49.5" }, { recid:7, check:true , name:"山本次郎", age:"44", sex:"1", birth:"1976/03/27", height:"168.5", weight:"62.1" }, { recid:8, check:true , name:"阿部博" , age:"48", sex:"1", birth:"1972/03/28", height:"180.4", weight:"75.2" } ] }); }); function showChanged() { console.log(w2ui['grid'].getChanges()); w2alert('コンソールに変更データを表示しました'); } </script> </body> </html>
これを実行させると以下の様な表示になります。
-
このブログを訪ねて頂いている方は初心者のプログラマの方が多いと思います。 ところで皆さんはどんなテキストエディタをお使いでしょうか。
無料のエディタであれば TeraPad 、 EmEditor もしくは サクラエディタ などでしょうか。 私も20年ぐらい前ですが TeraPad などを使っていましたが、ある時、テキストファイルの編集中にプログラムが異常終了してテキストが飛んでしまったことがありました。
C言語か何かのソースを入力中でしたので、目の前真っ暗になりました。 無料のエディタですので、何が有っても使用者の責任なので仕方ないのですが...
その時にテキストエディタといえども、お金を少し出して安心できるソフトを使うべきだなと思いました。
そこで当時からプログラマの間では評判になっていた【秀丸エディタ】を使うことを決めました。
このエディタですが、いろいろ使い勝手が良くて、さらに動作が非常に速いのです。
以下は私が使っていての「おすすめポイント」です。 このほかにも各種機能が豊富で全ての機能を使っていませんが、とにかくテキストエディタの中ではこれ一択だと思います。
- 各種の文字コードに対応(テキストファイルのコード変換が簡単)
- ブロック(矩形領域)のコピー、削除ができる
- 文字列の検索に正規表現が使える
- grep検索ができる
- 複数のファイルをタブ表示できる
- ファイルをバイナリ表示できる
テキストエディタの 秀丸エディタ のほかにメールソフトの 秀丸メール や 秀丸ファイラー がパックされています。
■各種の文字コードに対応(テキストファイルのコード変換が簡単)
以下の文字コードに対応していますが、これぐらいあれば普通に問題無いと思います。
- 日本語(Shift-jis)
- 日本語(EUC)
- 日本語(JIS)
- Unicode(UTF16)
- Unicode(UTF16,Big-Endian)
- Unicode(UTF8)
- Unicode(UTF7)
- Unicode(UTF32)
- Unicode(UTF32,Big-Endian)
- その他
秀丸 ではテキストファイルを開く時に使用されている文字コードを自動で判定して読込みます。 自動判定がうまくいかない場合は、手動で文字コードを指定して再度読込を行います。
便利な使い方としては、一旦そのままの状態でテキストファイルを読込んでおいて、 文字コードのエンコードの種類を変更して、エディタに表示されているままで上書きすれば別の文字コードでテキストファイルを書込みます。
つまりテキストファイルの文字コード変換を、一旦エディタに読込んでテキスト内容を確認して、文字コードを変更したいコードにして変換登録となります。■ブロック(矩形領域)のコピー、削除ができる
プログラムを組んでいるとテキストの矩形領域のコピーがほしい場合があります。 例えば、以下の図を見て下さい。 <li> タグのリストの中に下の方にある文字列の一覧を挿入する作業を行います。
カーソルの位置を文字列の先頭の位置に移動し [Ctrl] + [B] キーを押下(メニューの中の「BOX選択開始」を選択)し、 カーソルをコピーしたい場所まで移動します。 この時、右側の改行位置を超えてカーソルを移動すれば、改行のあるところまでの文字列をブロックと認識します。 以下の図は、ブロックを指定したところです。
ブロックの指定の最後で [Ctrl] + [C] キーを押下してコピーを取ります。 その後で、カーソルをコピーしたい位置に移動し [Ctrl] + [V] キーを押下(メニューの中の「BOX貼り付け」を選択)し、 コピーを終了します。
ブロックコピーは結構な頻度で使います。 VB.NET ではこの様なことが出来ないので 秀丸 に関数部分を抜き出してきて編集した後で VB.NET に戻すようなことをやっています。
■文字列の検索に正規表現が使える
Javascript や PHP などでも文字列チェックなどで用いられる正規表現ですが、 これを検索文字列として指定できます。(下図は検索文字列 [0-9] として数字の存在を指定)
■grep検索ができる
grep検索 とは指定フォルダの中の指定ファイルに検索指定文字列が存在することを検索し、 その検索文字列を含んだ行を全て抽出してくれます。(下図は検索文字列 [0-9] として数字の存在を指定)
下図は grep検索 の結果が別のタブで表示される様子です。
このタブウインドウの中のどれかの行でダブルクリックすると、該当するファイルがオープンし該当行にジャンプしてくれます。
この機能は結構便利で、関数名は分かっているがどのファイルで使用しているかを探したりすることに使っています。
■複数のファイルをタブ表示できる
テキストエディタでは当然の機能ですが、複数のファイルをタブで分けて表示できます。
■ファイルをバイナリ表示できる
これは特殊な用途ですが、バイナリ表示(HEX表示)を行いその中で編集を行った後でファイルを登録もできます。
下図はバイナリ表示させた例です。以下のファイルのバイナリ表示です。
※メニューの操作について
最初にメニューの中の [その他] ⇒ [コマンド一覧] を選択すると [ファイル] メニューの下に特別なメニューが表示されます。 このメニューの [ファイル系] ⇒ [バイナリモード] を選択すると現在のファイルがバイナリモードになります。