2011年3月21日月曜日

CSVファイルをExcelファイルに変換するツール

CSVファイルをExcelに読み込むと0詰めした数値や日付が異なる書式になってしまうという問題があります。『外部データの取り込み』機能を使用することによりCSVやタブ区切りテキスト等をそのまま読み込むこともできますが、手順がややこしいのでCSVからXLSに変換するプログラムで作ってみました。

なお、CSVファイルの形式はソフトによって微妙に仕様が異なるものの、RFC 4180で標準的な仕様がまとめられています。


■ソースについて■

Visual Studio 2008(C#)で開発しています。
zlib/libpng Licenceで配布します。

■ソースの説明■

Excelを操作するために、COMオブジェクトへの参照設定を追加する必要があります。
Excelのバージョンによって表記が異なりますが、ここでは『Microsoft Excel 11.0 Object Library』を追加しています。


usingで以下のパッケージの使用を宣言します。InteropServicesにあるMarshalクラスはCOMオブジェクトを操作するのに使用します。
using System.Runtime.InteropServices;

using Microsoft.Office.Interop.Excel;
Excelを操作するにはApplicationクラスのインスタンスを作成します。
エラー時にもメッセージを表示しないように、DisplayAlertsにはfalseを指定しておきます。
ExcelObj = new Application();
ExcelObj.DisplayAlerts = false;
 この後、ワークブック、シート、セル、レンジの順にオブジェクトを取得します。
取得したオブジェクトは不要になったらReleaseComObjectで開放します。
開放を忘れるとExcelのプロセスが終了しません。
Workbooks workbooksObj = ExcelObj.Workbooks;
Marshal.ReleaseComObject(workbooksObj);
レンジオブジェクトのValue2プロパティを使用しセルに任意の値を設定します。
cellObj = (Range)rangeObj[row + 1, col + 1];
cellObj.Value2 = value;
最後に、SaveAsでファイルに保存します。
このとき、Excelのバージョンによってフォーマットの定数が異なるので注意が必要です。
BookObj.SaveAs(filePath, fileFormat, null, null, null, null, XlSaveAsAccessMode.xlExclusive, null, null, null, null, null);

■ダウンロード■
 
プログラム:
http://tecproglab.googlecode.com/files/csv2xls.zip
 
実行ファイル:
http://tecproglab.googlecode.com/files/csv2xls.exe.zip
 
SVN:
http://tecproglab.googlecode.com/svn/trunk/vcs/csv2xls

2011年1月31日月曜日

VB.netで常駐プログラム

VB.netで常駐プログラムを作ろうと思い立ったので実現方法を調べてみました。

サンプルソースコード


■ウィンドウの非表示■

標準ではフォームが表示されてしまうので、ShownイベントでVisibleにFalseを設定し、常に非表示にします。
Private Sub Form_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown

    Me.Visible = False

End Sub
 また、ShowInTaskbarプロパティにFalseを設定し、タスクバーに表示されないようにします。


■タスクトレイにアイコンを表示■

タスクトレイ(タスクバーの右端に並ぶアイコンのことです)にアイコンを表示する方法ですが、NotifyIconクラスを使用します。
使い方は簡単で、ツールボックスからフォームにNotifyIconを貼り付けるだけです。アイコンや表示するテキストはプロパティから変更できます。

NotifyIconのイベントではアイコンをクリックした場合のマウスイベントを拾えます。また、ContextMenuStripプロパティを使用すれば、右クリック時に表示するメニューを設定できます。サンプルでは終了のメニューを表示しています。

■デスクトップにウィンドウを張り付ける■

Win32APIをいくつか使用するとデスクトップに張り付いたウィンドウを表示できます。

以下のWin32APIを定義します。
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Integer) As Integer

Public Declare Function FindWindow Lib "USER32.DLL" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Declare Function SetParent Lib "USER32.DLL" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
ウィンドウタイトルより”Program Manager”を検索し、親ウィンドウに設定します。
また、デスクトップ上のアイコンに隠れないように最前面に表示します。
Protected Sub SetFormPosDesktop(ByVal targetForm As Form)

    Dim hProgramManagerHandle As Integer
    hProgramManagerHandle = FindWindow(vbNullString, "Program Manager")
    Call SetParent(targetForm.Handle.ToInt32, hProgramManagerHandle)
    Call SetForegroundWindow(targetForm.Handle.ToInt32)
End Sub

試しにカレンダーのサンプルを作成してみました。
実行した画面はこんな具合です。
画像だとわかりにくいかもしれませんが、ウィンドウをアクティブにしてもデスクトップに張り付いています。


ソースコードとサンプルプログラムはこちら↓からダウンロードできます。
http://tecproglab.googlecode.com/files/Calendar.zip
開発環境:Windows 7, VS2005Pro