|
* Excel範囲コピー、SQLPLUS風に貼り付け [#f7edf7ac] -ページ: [[Macro/投稿]] -作者: [[ガンジャム]] -カテゴリー: js -投稿日: 2006-12-15 (金) 23:39:58 ** メッセージ [#mfa2644b] 文字列バイト長取得にpeakさんのbyteLengh()を利用してすっきりしました。 #code(javascript){{ //excelPaste.js //Excel等で表範囲をコピーした際のタブ区切りクリップボードデータをSQLPLUS風に整形して挿入 //1行目をヘッダ行として2行目にセパレート行を追 //セル結合は無視。セル内改行は半角ブランクに置換。 var arrMaxWidth = new Array(), arrHeadLine = new Array(), arrDataLines = new Array(); var lineCount = 1; main(); function main() { var arrSplitLine = getClipbrd(); if (arrSplitLine) { seprateTab(arrSplitLine); var insTex = setEachLines(); Editor.InsText(insTex); } } function getClipbrd() { var ie = new ActiveXObject("InternetExplorer.Application"); ie.Navigate("about:blank"); var clip = ie.Document.parentWindow.clipboardData.getData("Text"); ie = null; if (clip) { return(clip.split("\r\n")); } else { return(false); } } function seprateTab(arr) { var re = /\n/g; for (i in arr) { var strLine = arr[i]; if (strLine) { strLine = strLine.replace(re, " "); splitTab(strLine); } lineCount++; } } function splitTab(str) { if (lineCount == 1) { arrHeadLine = str.split(" "); compareLength(arrHeadLine, 0); } else { var dataLine = str.split(" "); compareLength(dataLine, 1); arrDataLines[lineCount] = dataLine; } } function compareLength(arr, f) { if (f == 0) { for (var i=0 in arr) { arrMaxWidth[i] = byteLength(arr[i]); } } else { var ln = new Array(); for (var i=0 in arr) { ln[i] = byteLength(arr[i]); if (arrMaxWidth[i] < ln[i]) { arrMaxWidth[i] = ln[i]; } } } } function setEachLines() { var hline = "", dlines = "", sline = ""; hline = attachWidth(arrHeadLine).join("|") +"\r\n"; for (i in arrDataLines) { dlines += attachWidth(arrDataLines[i]).join("|") +"\r\n"; } sline += setSeprateLine(arrMaxWidth).join("|") +"\r\n"; return(hline + sline + dlines); } function attachWidth(arrColumn) { for (var i=0 in arrMaxWidth) { var colWth = byteLength(arrColumn[i]); if (colWth < arrMaxWidth[i]) { var strBlank = ""; for (j=0; j < (arrMaxWidth[i] - colWth); j++) { strBlank += " "; } arrColumn[i] += strBlank; } } return(arrColumn); } function setSeprateLine(arrColumn) { var arrDash = new Array(); for (i in arrColumn) { var strDash = ""; for (j=0; j < arrMaxWidth[i]; j++) { strDash += "-"; } arrDash[i] = strDash; } return(arrDash); } function byteLength(s) { var len = s.length; var blen = len; for (i=0; i<len; i++) { if (isWide(s.charCodeAt(i))) { blen++; } } return(blen); } function isWide(charCode) { return(0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode)); } }} ---- - VBScriptをこんな力業で読ませなくても,拡張子.wsfなら複数言語の混在が出来たような -- [[げんた]] &new{2006-12-26 (火) 00:57:19}; - wsfファイルで作ってみましたがサクラだとエラーになりました。wsf対応してるのかな? -- [[ガンジャム]] &new{2006-12-26 (火) 15:43:04}; - peakさんのマクロ[[../158]]にある2バイト文字判定関数を利用するとか. -- [[maru]] &new{2006-12-27 (水) 02:32:40}; - peakさんので更新しました -- [[ガンジャム]] &new{2006-12-30 (土) 15:16:18}; #comment |