|
|
お勧め1「テンプレート作成支援言語(T言語)」ver 1.4.1
2012/01/26 更新
テンプレート作成支援言語について
ダウンロードする。
お勧め2「ブラウザ自動操作ツール(IEAuto2009)」ver 1.7.1.3
2011/11/04 更新。
ブラウザ自動操作ツール(IEAuto 2009)について
ダウンロードする。
ヘルプ
お勧め3「データベース更新前更新後比較ツール(DBCMP) Oracle接続可」ver 1.4.0 20010/03/14
新規公開
ダウンロードする。
|
00174
T言語 一部修正
登録日:2012/01/26 2:18:48
更新日:2012/01/26 2:18:48
テンプレート作成支援言語(T言語)」ver 1.4.1
・xls,xlsxの場合、先頭1列目以外で、空白セルが存在する場合でも、エラーとしないように変更。
・NOW,USERNAME命令を、CSVのデータ分出力する場合の命令(NOW2,USERNAME2)を追加。
→今までだと、NOW,USERNAME命令を使うと、CSVが複数行定義されていても、
実行結果は1行しか出力されなかった。
|
|
00173
T言語 Loop命令追加
登録日:2011/12/26 2:04:25
更新日:2011/12/26 2:04:25
%START%.#Loop(繰り返し回数)# 〜 %END%
%START%から%END%の内容を、繰り返し回数分出力します。
使用用途としては、CSVファイルに1行のみ定義しておき、
テンプレートに当ブロック命令の実装を行い、出力をする。
出力をするときに、%LOOP_COUNT%命令を使用すると、繰返し中のカウント値を出力することができる。
%LOOP_COUNT%命令は、Loopブロック命令で使用しない場合は1が出力される。
%LOOP_COUNT%命令は、カウント値を出力するときのフォーマット(ゼロパティング)を指定することができる。
実装方法は下記例を参考。
■CSVファイル例
苗字 名前 年齢 身長
てすと たろう 20 165
■テンプレートファイル例
%START%.#Loop(5)#
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('%LOOP_COUNT(00000000)%', '%苗字%%LOOP_COUNT(0000)%' ,'%名前%%LOOP_COUNT%','%年齢%','%身長%');
%END%
■出力結果
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('00000001', 'てすと0001' ,'たろう1','20','165');
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('00000002', 'てすと0002' ,'たろう2','20','165');
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('00000003', 'てすと0003' ,'たろう3','20','165');
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('00000004', 'てすと0004' ,'たろう4','20','165');
INSERT INTO TBL_USER(ID,NAME1,NAME2,OLD,TALL) VALUES ('00000005', 'てすと0005' ,'たろう5','20','165');
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
続きを見る
|
|
00172
T言語 Excel対応版開発中2
登録日:2011/12/05 2:48:45
更新日:2011/12/05 2:48:45
1.3.1 betaに更新
・Excelファイル(xls, xlsx)の読み込みに対応(tl.exe側)
・CSVファイル、テンプレートで取り込んだファイルをリストから選択できるように変更。
・xls,xlsxの場合、タイトル行に改行が含まれる場合、改行を取り除くように変更。
・xls,xlsxの場合、タイトル行に改行が含まれる場合、実行ボタン完了時にxlsの設定情報をファイル目に関連付けて保存するように変更。
次回以降はファイルを開くと同時に設定が読み込まれます。
・xls,xlsxの場合、データ行とは別に定義されている値の読み込みに対応させる為、その他データセル項目を追加。
→定義されている値のセルを指定する。複数ある場合はカンマ区切りで指定する。
扱いとしては、データ行の行数分、定義した値が設定され、タイトル行の値はセル位置(書式:A1)となる。
例:セルB3に「TestClass」という値が定義されており、タイトル行、データ行が、以下の表の場合
┏━━━┳━━━━┓
┃変数名┃コメント ┃←タイトル行
┣━━━╋━━━━┫
┃name ┃名前 ┃←データ行(1行目)
┣━━━╋━━━━┫
┃id ┃ID ┃←データ行(2行目)
┗━━━┻━━━━┛
次の表として扱われる
┏━━━┳━━━━┳━━━━━┓
┃変数名┃コメント ┃B3 ┃←タイトル行
┣━━━╋━━━━╋━━━━━┫
┃name ┃名前 ┃TestClass ┃←データ行(1行目)
┣━━━╋━━━━╋━━━━━┫
┃id ┃ID ┃TestClass ┃←データ行(2行目)
┃id ┃ID ┃TestClass ┃←データ行(2行目)
┗━━━┻━━━━┻━━━━━┛
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
続きを見る
|
|
00171
T言語 Excel対応版開発中
登録日:2011/11/28 0:07:24
更新日:2011/11/28 0:07:24
C#とExcelの連携がだいぶできるようになってきたので、
T言語でExcelのブックも対象にできるように開発中です。
読み込むブックファイル
※1.タイトル行に関しては、2行での定義まで対応。
2.データ行に関しては、行に対するセルの結合があっても読み込めるように対応。
→Excelブックで定義した場合、同じ値を何度も定義する必要がなくなります!
新型T言語の読み込み画面
コンソール側は、現在未実装・・・
|
|
00169
C# Excelブック読み込み3
登録日:2011/11/19 20:28:28
更新日:2011/11/23 23:59:50
COMオブジェクトの解放がソース内にいっぱいでてきてしまうので、
それを管理するクラスを1つ作ってみました。
Objective-C言語のNSAutoreleasePoolクラスのアイディアを参考に作りました。
「C# Excelブック読み込み2」の実装よりかはすっきりします。
2011/11/23更新!
コンソールアプリで動かしていたのでずっと気づかなかったのですが、
このロジックだと、実際Excelのプロセスが残ってしまいます。
コンソールアプリだとアプリ終了と同時にExcelプロセスも消えていたので分からなかったです。(言い訳
foreach(object sheet in (System.Collections.IEnumerable)sheets) {
string nowName = (string)Property(cp, sheet, "name");
↓
System.Collections.IEnumerable enumSheets = (System.Collections.IEnumerable)sheets;
cp.AddObject(enumSheets);
foreach(object sheet in enumSheets) {
cp.AddObject(sheet);
string nowName = (string)Property(cp, sheet, "name");
※1. sheetsのIEnumerableへのキャスト後のオブジェクトも解放する必要がある。
※2. sheetオブジェクトも解放する必要がある。
sheetオブジェクトの解放は完全に漏れていましたが、IEnumerableへのキャスト後のオブジェクト
も解放しないといけないとは知らなかったです・・・。
タスクマネージャーと3時間ぐらいにらめっこしてましたw
COMオブジェクト自動解放プールクラス
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
using System;
using System.Collections.Generic;
/// <summary>
/// COMオブジェクト自動解放プールクラス
/// </summary>
class ComAutoReleasePool : IDisposable {
/// <summary>
/// スタックで管理する。(最後に生成したオブジェクトから順番に解放を行う為)
/// </summary>
private Stack<object> st = new Stack<object>();
/// <summary>
/// System.__ComObject以外でComPoolでCOMオブジェクトを管理したい場合に、使用します。
/// 例:microsoft.office.interop.excel.applicationclassのオブジェクト
/// </summary>
/// <param name="obj">COMオブジェクト</param>
public void AddComObject(object obj) {
if(obj != null) {
st.Push(obj);
}
}
/// <summary>
/// COMオブジェクトか判断つかないが、ComPoolでCOMオブジェクトを管理したい場合に、使用します。
/// COMオブジェクトと判断された場合ComPoolで管理されます。
/// </summary>
/// <param name="obj"></param>
public void AddObject(object obj) {
if(obj != null && obj.ToString() == "System.__ComObject") {
st.Push(obj);
}
}
/// <summary>
/// ComPoolで管理されているCOMオブジェクトの解放を行います。
/// </summary>
public void Dispose() {
if(st != null) {
foreach(object obj in st) {
try {
if(obj != null) {
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
}
} catch(Exception) {
// 例外は無視する。
}
}
}
st = null;
}
/// <summary>
/// ファイナライズ
/// </summary>
~ComAutoReleasePool() {
Dispose();
}
}
|
ExcelUtilクラス(使用例)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
/// <summary>
/// ExcelUtilクラス
/// </summary>
public static class ExcelUtil {
/// <summary>
/// Excelのバージョン(2003, 2007, 2010, other)を返却します。
/// Excelがインストールされていない場合は""を返却します。
/// </summary>
/// <returns>バージョン</returns>
public static string GetVersion() {
string result = "";
// Excelアプリケーションに接続
using(ComAutoReleasePool cp = new ComAutoReleasePool()) {
object app = CreateObject(cp, "Excel.Application");
try {
// バージョンを取得
string version = (string)Property(cp, app, "Version");
if("11.0".Equals(version)) {
result = "2003";
} else if("12.0".Equals(version)) {
result = "2007";
} else if("14.0".Equals(version)) {
result = "2010";
} else {
result = "other(Version:" + version + ")"; //10.0:officeXP
}
} catch(TargetInvocationException) {
throw new Exception("異常終了しました");
} finally {
if(app != null) {
Method(cp, app, "Quit");
}
}
}
return result;
}
/// <summary>
/// Excelファイルを読み込む
/// </summary>
/// <param name="path">Excelファイルパス</param>
/// <param name="sheetName">シート名</param>
/// <param name="startRow">開始行数</param>
/// <param name="startCol">開始列数</param>
/// <returns>List</returns>
public static List<List<List<string>>> ReadBook(
string path
, string sheetName
, string startRow
, string startCol
) {
List<List<List<string>>> result = new List<List<List<string>>>();
using(ComAutoReleasePool cp = new ComAutoReleasePool()) {
object app = null;
try {
object[] args = null;
// Excelアプリケーションを起動する
app = CreateObject(cp, "Excel.Application");
// Excelファイルを開く
object workbooks = Property(cp, app, "Workbooks"); // Application.Workbooks
args = new object[15];
args[0] = path;
for(int i = 1; i < 15; i++) {
args[i] = Type.Missing;
}
object book = Method(cp, workbooks, "Open", args); // Workbooks.Open(path)
// ファイル内容を読み込む
object sheets = Property(cp, book, "Sheets"); // Sheets
System.Collections.IEnumerable enumSheets = (System.Collections.IEnumerable)sheets;
cp.AddObject(enumSheets);
foreach(object sheet in enumSheets) {
cp.AddObject(sheet); // ADD 2011/11/23 追加!
string nowName = (string)Property(cp, sheet, "name");
if(nowName == sheetName || sheetName.ToLower() == @"\all") {
result.Add(GetSheetContent(sheet,
int.Parse(startRow), int.Parse(startCol)));
}
}
} catch(TargetInvocationException) {
throw new Exception("異常終了しました");
} finally {
if(app != null) {
Method(cp, app, "Quit");
}
}
}
return result;
}
/// <summary>
/// シートの内容を読み込みListで返却します。
/// </summary>
/// <param name="sheet">sheet</param>
/// <param name="startRow">読み込み開始行</param>
/// <param name="startCol">読み込み開始列</param>
/// <returns>List</returns>
private static List<List<string>> GetSheetContent(object sheet, int startRow, int startCol) {
List<List<string>> result = new List<List<string>>();
using(ComAutoReleasePool cp1 = new ComAutoReleasePool()) {
// Excelを編集中の場合、正しい値を読み込めない場合がある。
// 最終行、最終列を取得する
object cells = Property(cp1, sheet, "Cells"); // Sheet.Cells
int maxRow = 0;
int maxCol = 0;
// 11:xlCellTypeLastCell
object lastCell = Method(cp1, cells, "SpecialCells", 11, Type.Missing); // Cells.SpecialCells(11)
maxRow = (int)Property(cp1, lastCell, "Row"); // Cell.Row
maxCol = (int)Property(cp1, lastCell, "Column"); // Cell.Column
int row = startRow;
while(row <= maxRow) {
List<string> lstCells = new List<string>();
int rowCount = 0;
int col = startCol;
while(col <= maxCol) {
string text = null;
int colCount = 0;
// 1ループ毎にCOMオブジェクトを管理し、解放する。
using(ComAutoReleasePool cp2 = new ComAutoReleasePool()) {
object cell = Property(cp2, cells, "Item", row, col); // Cells(row, col)
object range = Property(cp2, cell, "MergeArea"); // Cell.MergeArea
text = (string)Property(cp2, cell, "Text"); // Cell.Value
// セル結合されたいた事を想定し、横何個分か取得する
object rows = Property(cp2, range, "Rows"); // Range.Rows
int rowCountWk = (int)Property(cp2, rows, "Count"); // Rows.Count
// 結合数が多い方を次の行数を求める加算値とする
if(rowCount < rowCountWk) {
rowCount = rowCountWk;
}
// セル結合されたいた事を想定し、縦何個分か取得する
object cols = Property(cp2, range, "Columns"); // Range.Columns
colCount = (int)Property(cp2, cols, "Count"); // Columns.Count
}
lstCells.Add(text);
col += colCount;
}
result.Add(lstCells);
row += rowCount;
}
}
return result;
}
/// <summary>
/// オブジェクトのファンクションまたはサブルーチンを実行します。
/// COMオブジェクトが返却される場合は、引数のComPoolにも保存されます。
/// 返却されたCOMオブジェクトを使用しない場合は、ComPool.Disposeを行ってください。
/// </summary>
/// <param name="cp">COMプール</param>
/// <param name="obj">オブジェクト</param>
/// <param name="name">ファンクション名またはサブルーチン名</param>
/// <param name="para">ファンクションまたはサブルーチンにパラメータが存在する場合は
/// パラメータを指定する</param>
/// <returns>object</returns>
private static object Method(ComAutoReleasePool cp, object obj, string name, params object[] para) {
object wk = obj.GetType().InvokeMember(
name, BindingFlags.InvokeMethod, null, obj, para);
cp.AddObject(wk);
return wk;
}
/// <summary>
/// オブジェクトのプロパティを取得します。
/// COMオブジェクトが返却される場合は、引数のComPoolにも保存されます。
/// 返却されたCOMオブジェクトを使用しない場合は、ComPool.Disposeを行ってください。
/// </summary>
/// <param name="cp">COMプール</param>
/// <param name="obj">オブジェクト</param>
/// <param name="name">ファンクション名またはサブルーチン名</param>
/// <param name="para">ファンクションまたはサブルーチンにパラメータが存在する場合は
/// パラメータを指定する</param>
/// <returns>object</returns>
private static object Property(ComAutoReleasePool cp, object obj, string name, params object[] para) {
object wk = obj.GetType().InvokeMember(
name, BindingFlags.GetProperty, null, obj, para);
cp.AddObject(wk);
return wk;
}
/// <summary>
/// COMオブジェクトを生成し返却しますします。
/// 生成されたCOMオブジェクトは数のComPoolにも保存されます。
/// 返却されたCOMオブジェクトを使用しない場合は、ComPool.Disposeを行ってください。
/// </summary>
/// <param name="cp">COMプール</param>
/// <param name="obj">オブジェクト</param>
/// <param name="name">ファンクション名またはサブルーチン名</param>
/// <param name="para">ファンクションまたはサブルーチンにパラメータが存在する場合は
/// パラメータを指定する</param>
/// <returns>object</returns>
private static object CreateObject(ComAutoReleasePool cp, string name) {
Type classType = Type.GetTypeFromProgID(name);
if(classType == null) {
return null;
}
object wk = Activator.CreateInstance(classType);
cp.AddComObject(wk);
return wk;
}
}
|
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
続きを見る
|
|
00168
C# Excelブック読み込み2
登録日:2011/11/13 23:48:08
更新日:2011/11/23 23:51:49
セルの読み込み開始位置に対応したVerです。
シート名の指定も可能となっています。(1つの指定またはすべて対象)
結合セルも考慮しています。
読み込むブックファイル
実行結果
開発環境
Windows7 Office2010(32bit) VisualStudio2010(.NetFramework:2.0を指定)
検証環境
WindowsXP Office2003
WindowsVista Office2007
Windows7 Office2010(32bit)
2011/11/23更新!
『C# Excelブック読み込み3参照』
|
|
00164
C# Excelブック読み込み
登録日:2011/11/06 21:47:22
更新日:2011/11/23 23:51:28
C#にて、Excelブック(xls, xlsx)を読み込むプログラム
参考URL: http://d.hatena.ne.jp/kurukuru-papa/20100704/1278243371
C# 2.0以上(Visual Studio 2010で.Netframework2.0にてコンパイル)
Excel 2003以上(2003, 2007, 2010, 未インストール)で動作確認。
※仮想環境上のVista,Office2007だと、Excelプロセスが終了してくれない・・・
UACが悪さをしているかと思い切ってみたけど解決しない・・・
→原因
COMオブジェクトは参照カウンタで管理しているので独自の解放が必要。具体的には
System.Runtime.InteropServices.Marshal.ReleaseComObjectでCOMを解放していなかった為。
Vista以外だとなんで解放されたんだろ・・・
参考URL: http://support.microsoft.com/default.aspx?scid=kb;ja;317109
http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
2011/11/23更新!
『C# Excelブック読み込み3参照』
|
|
00170
UTF8 BOM無
登録日:2011/11/20 11:54:12
更新日:2011/11/20 11:54:12
System.Text.Encodingクラスのオブジェクトを作成するときに、
System.Text.Encoding.UTF8で取得してしまうとBOM有になってしまう。
BOM無にするには、
System.Text.UTF8Encoding(false)で取得する必要がある。
Encoding encode = new UTF8Encoding(false);
|
|
00167
java String.sprit
登録日:2011/11/11 8:44:25
更新日:2011/11/11 8:44:25
spritメソッドは第二引数に-1を指定しないと後ろの空文字列が無視される
-1を指定しないと
"111,222,333,,"
は
"111"と"222"と"333"になる
指定すると
"111"と"222"と"333"と""と""になる
|
|
00166
折りたたみキーボード
登録日:2011/11/11 8:35:52
更新日:2011/11/11 8:35:52
メモ
ipadで下記キーボードを使う場合
TK-FBP019EBK
win space で日本語、英語に切り替える
|
|