VB.NETからExcelファイルを生成する方法について
プログラマーなので少しプログラミングのネタから
通常、VB.NETからExcelファイルを扱う場合は、参照設定にExcelのObject Libraryを追加し以下の様なプログラムで処理します。この例は、新しくExcelブックを生成し、最初のシートのA列の2行目から1000行同じ文字列を設定する簡単なプログラムです。
--------------------------------------------------------------------
Imports System.Runtime.InteropServices.Marshal
...<中略>...
Dim strTimeStart As String = DateTime.Now.ToString '開始時刻
'Excel.Application の新しいインスタンスを生成し、各オブジェクトを取得
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = xlBooks.Add
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
'セルへのデータ設定
Dim xlCells As Excel.Range = xlSheet.Cells
Dim xlRange As Excel.Range
Dim i As Integer
For i = 1 To 1000
xlRange = DirectCast(xlCells(i + 1, 1), Excel.Range)
xlRange.Value = "テスト文字列" & i
ReleaseComObject(xlRange) 'xlRange の解放
Next
ReleaseComObject(xlCells) 'xlCells の解放
xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定
xlSheet.SaveAs("c:\Test1.xls") 'ファイルに保存
ReleaseComObject(xlSheet) 'xlSheet の解放(COMオブジェクト参照カウントを解放)
ReleaseComObject(xlSheets) 'xlSheets の解放
xlBook.Close(False) 'xlBook を閉じる
ReleaseComObject(xlBook) 'xlBook の解放
ReleaseComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
ReleaseComObject(xlApp) 'xlApp を解放
Dim strTimeEnd As String = DateTime.Now.ToString '終了時刻
MessageBox.Show("Test1.xls を作成しました。" & vbCrLf & strTimeStart & "~" & strTimeEnd, "完了メッセージ")
--------------------------------------------------------------------
この様に組んでも、途中エラーで終了したりすると、プロセスにExcel.EXEが残ったままになったりします。この辺が、OfficeのExcelを他のプログラムから操作するときにネックになります。
また、このCOMオブジェクトを利用した方法では、非常に時間が掛かります。
1個のセルに値を設定するだけでも、COMオブジェクトを介してのExcelの機能を利用するわけですから仕方なのかもしれません。
実際、例のプログラムでは9~10秒ぐらい掛かりました。(Excelのインスタンス生成に2~3秒は掛かります)時間が掛かっても問題ない場合はいいのですが、処理実行に30秒以上掛かるようでは実用に耐えません。
さらに、該当するソフトを動作させるPCにはExcelがインストールされている必要があります。
そこでExcelの処理を行なえるコントロールが市販されていないかいろいろ調べたところ、
アドバンスソフトウェア株式会社から販売されていました。
「ExcelCreator 5.0 for .NET」(Excel 97/2000/2002/2003)
「ExcelCreator 2007」(Excel 2007)
早速、体験版をダウンロードして使ってみました。
実行速度は、やはりDLLを直接呼んでいることからExcelオブジェクトを使うより格段の差がありました。先ほどの例と同じ結果が得られるプログラムを以下に示します。
--------------------------------------------------------------------
Dim i As Integer
Dim XlsCreator1 As New ExcelCreator.XlsCreator
Dim strTimeStart As String = DateTime.Now.ToString '開始時刻
With XlsCreator1
'ブック作成
.CreateBook("Test.xls", 3, ExcelCreator.xlVersion.ver2000)
'シート名の設定
.SheetName = "Test"
For i = 1 To 1000
'出力
.Cell("A" & i).Str = "テスト文字列" & i
Next i
'クローズ
.CloseBook(True)
End With
Dim strTimeEnd As String = DateTime.Now.ToString '終了時刻
MessageBox.Show("Test.xls を作成しました。" & vbCrLf & strTimeStart & "~" & strTimeEnd, "完了メッセージ")
--------------------------------------------------------------------
このプログラムの実行時間は1~2秒ぐらいでした。
Excel出力等で処理時間が掛かって悩んでいる方は一度使ってみてはいかがでしょうか。
この会社、以前、郵便番号入力ソフトの「Yubin7」やファイルコンバータの「52DISKL32」を使ったことがあったので知ってはいましたが、結構面白いツール等を開発している様です。
コメント