- 追加された行はこの色です。
- 削除された行はこの色です。
* Excel範囲コピー、SQLPLUS風に貼り付け [#f7edf7ac]
* カンマorタブ区切りデータを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));
}
}}
http://cid-b4b8259365d2529f.skydrive.live.com/browse.aspx/Public/Sakura%20Editor%20Macro
----
- 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};
- csvでもtsvでも -- [[ガンジャム]] &new{2007-06-26 (火) 22:15:56};
#comment