いろいろな会社で一般的に使われている表計算ソフトの
エクセル、これをプログラミングで操作できるように
なると、不要な業務時間をかなり短縮することが
できます。
エクセルも関数を使えば色々なことができますが
使い慣れていないと、ややこしい感じがします。
プログラミングでも多くの言語でエクセル操作は
出来ます。
特におすすめなのはjavascriptを使っての
エクセル操作。
理由はjavascriptを使うと非常に使い勝手の
いいエクセル操作のツールができます。
実際に何度も作っていますが、エクセルを仕事で使っている
場合はかなりの時間が短縮できるかと思います。
xlsファイルの入出力、やファイル操作
またエクセルそのものに近いものまでを
作ることができます。
プログラミング できること エクセル xlsファイルを入力
ソースは以前使ったものを
そのまま流用しています。
javascriptで xlsファイルの入出力を使うには
cdnから以下のライブラリを使います。
1 2 |
<script src="https://cdn.jsdelivr.net/npm/xlsx@latest/dist/xlsx.full.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/xlsx@latest/dist/cpexcel.js"></script> |
まずファイルコントロールを使いxlsファイル読み込みます。
その中でエクセルを配列に入れる関数を呼び出しているだけです。
エクセルファイルのチェックはしていません。
面倒なので複数のファイルの読み込みに
対応しているままです。
複数のファイルの読み込み時には
parseSheetの変更が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function OnFileSelect(inputElement) { var files = inputElement.files; var output = []; for (var i = 0, f; f = files[i]; i++) { var reader = new FileReader(); reader.onload = function (evt) { cnt++; if(cnt == files.length){ parseSheet(f); } reader.readAsDataURL(f); } } event.preventDefault(); } |
この関数で上から受け取ったxlsのblobファイル
を配列に読み込んでいます。
最終的にex_sheetという変数がエクセルの2次元配列に
なっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function parseSheet(blob){ var ex_sheet = []; var cnt = 0; var fr = new FileReader(); fr.readAsArrayBuffer(blob); fr.onload = function() { var bin = fr.result; const book = XLSX.read(bin, { type: "array", codepage: 932 }); const sheets = book.SheetNames.map((name)=>{ const sheet = XLSX.utils.sheet_to_csv(book.Sheets[name], { FS: "\u001F" }).split("\n").map((row)=>{ // console.log(row); //ここで一行のデータを取り扱う var r_ar = row.split("\u001F"); ex_sheet.push(r_ar); }); }); //ここでデータを処理する関数を呼び出す(セレクターで適当に選択) var conv = document.getElementById("convert").value; if(conv == 0){ XLStoArray(ex_sheet); }else if(conv == 1 || conv == 2){ XLStoDescription(ex_sheet); } } } |
プログラミング できること エクセル xlsファイル操作
xlsファイルを配列に読み込んでから操作するので簡単です。
javascriptのUIや正規表現を使ってプログラミング
していけば、いろいろな xlsファイル操作などが可能。
Facebookが公開しているfastTextを
使うと面白いことができそうです。
参考にエクセルのデータを普通の配列に
入れているだけのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function XLStoArray(xls_ar){ //console.log(ar[0][0]); var quiz_str=''; var e_word_ar=[]; var e_mean_ar=[]; var e_rank_ar=[]; var e_freq_ar=[]; var e_coment_ar=[]; var e_symbole_ar=[]; //xlsの構造 //0単語,1 rank,2頻度 ,3 意味,4解説,5 なし,6 なし,7発音記号 for(i = 0;i < xls_ar.length; i++ ){ //空行を出力しない if(xls_ar[i][0] != ''){ e_word_ar.push(xls_ar[i][0]); e_rank_ar.push(xls_ar[i][1]); e_freq_ar.push(xls_ar[i][2]); e_mean_ar.push(xls_ar[i][3]); e_coment_ar.push(xls_ar[i][4]); e_symbole_ar.push(xls_ar[i][7]); } } |
プログラミング できること エクセルに近いもの
プログラミングではエクセル風なのも
作れてしまいます。
しかもjavascriptの部分のコードの行数が29行で
作られたものもあり、参考になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
for (var i=0; i<6; i++) { var row = document.querySelector("table").insertRow(-1); for (var j=0; j<6; j++) { var letter = String.fromCharCode("A".charCodeAt(0)+j-1); row.insertCell(-1).innerHTML = i&&j ? "<input id='"+ letter+i +"'/>" : i||letter; } } var DATA={}, INPUTS=[].slice.call(document.querySelectorAll("input")); INPUTS.forEach(function(elm) { elm.onfocus = function(e) { e.target.value = localStorage[e.target.id] || ""; }; elm.onblur = function(e) { localStorage[e.target.id] = e.target.value; computeAll(); }; var getter = function() { var value = localStorage[elm.id] || ""; if (value.charAt(0) == "=") { with (DATA) return eval(value.substring(1)); } else { return isNaN(parseFloat(value)) ? value : parseFloat(value); } }; Object.defineProperty(DATA, elm.id, {get:getter}); Object.defineProperty(DATA, elm.id.toLowerCase(), {get:getter}); }); (window.computeAll = function() { INPUTS.forEach(function(elm) { try { elm.value = DATA[elm.id]; } catch(e) {} }); })(); |
http://jsfiddle.net/ondras/hYfN3/
上のページでサンプルとして動作もみれるので
一度試してみてはいかがでしょうか。