自分磨きのITノート

プログラミング(C#、VB.NET)言語やデータベースの役立つ情報を初心者から中級者向けに発信します。

.NET Tips

.Netでプロセス間/端末間/サーバ間通信するならWCFが便利

WCFとは

Windows Communication Foundationの略であり、Microsoftが提供する通信基盤です。
(.Net framework3.0より使用できます)

Webサービス標準のSOAPに準拠しXMLでやり取りが行われ、プロトコルを意識せず通信が行えます。
よく利用されるデータベースにアクセスするためのADO.NETもSOAP通信ですね。
今まではソケット通信だと敷居が高かったり、プロトコル(やり取り)の仕様を考えるのに労力がいりましたが、通信自体はWCFが自動でデータをシリアライズ化してやり取りしてくれます。
利用者は、メソッドをコールするような感覚で通信プログラムが作成できます。

また、サービスがマルチスレッドを管理してくれるので実装も非常に楽です。
メッセージは文字や数値以外に、配列や独自クラスを送ったり受け取ったりできるので色々な場面で使用できると思います。

Webサービス(http通信)だけでなく、プロセス間通信(名前付きパイプ)やPC間通信(TCP)も可能です。
、私もWCFを利用するようになり、こんな便利なライブラリがあるなら早くから試しておけばよかったと思っています。

20180118_wcf_image

続きを読む

VB.Net(C#)でExcelを読み書きできるライブラリEPPlusの使い方

ネットで”VB.Net Excel 読み書き"など検索すると、Excel Comオブジェクト(Microsoft.Office.Interop)を使った例が多く出てきます。しかし、あまりおすすめされていません

Excel Comオブジェクトは、バックグラウンドでExcelのプロセス(EXE)が実行されており、解放がしっかり行われていないとプロセスが残ったままになったりします。また、すでに起動しているExcelとの干渉を考慮しないといけません。

EXCELファイルの操作系ライブラリ(DLL)を使用することにより、自身のアプリケーションにライブラリをリンクできるため余計なプロセスを管理しなくても済みます。
Excel2007/2010形式からは、ファイルの中身がOffice Open XMLとなり、仕様が一般公開されているためライブラリは色々あります。(中身はXMLファイルで構成され、ファイル全体はZIP圧縮されている)

ライブラリの種類

.Net対応のEXCELファイル操作系ライブラリの有名どころは、NPOIEPPlusClosedXMLなどがあります。 機能が豊富で人気が高いEPPlusを今回を紹介します。

EPPlusは、過去のファイル形式である.xlsは読み書きできませんが、.xlsx形式は対応しています。
今後.xlsファイル形式を作成することも少ないですし、.xlsxが主流のシステムはすでに多いはずです。
また、ライセンスはLGPL ライセンスですし、フリー(無償)で使えるメリットは大きいです。

インストール方法

★このライブラリを使うにあたってMicrosoft OfficeのExcelはインストール不要である。

以下、2つインストール方法があるがお好みでどうぞ!

・Visua lStudioのNuGetで検索"EPPlus"を検索してインストール。
 →対外は安定板をダウンロードすることになると思います。

・サイトからDLLをダウンロード
http://epplus.codeplex.com/
 →右のダウンロードボタンより


Visual Studioのソリューションエクスプローラの[参照]の参照タブよりダウンロードしたEPPlus.dllを追加する。
対象アプリのプラットフォームが.Net3.5なら.Net3.5版。.Net4シリーズは.Net4版のDLLを使用する。

これを書いた時のEpPlusバージョンは、4.1.0でした。

XLSXファイル作成と値書込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = True Then fi.Delete()
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets.Add("Sheet1")
         '// セルを指定して代入(ExcelVBA同様1から始まる)'
         sheet1.Cells(1, 1).Value = "write time" 
         sheet1.Cells(2, 1).Value = Now.ToString("yyyy/MM/dd")
         sheet1.Cells(3, 1).Value = Now.ToString("HH:mm:ss")
         Call pkg.Save()  '// 保存。名前を変えて保存はSaveAs()'
         sheet1.Dispose()
      End Using
      MessageBox.Show("出力OK!!")
   End Sub 

C#

        // using OfficeOpenXml
        private void button1_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == true) { fi.Delete(); }
            using (ExcelPackage pkg = new ExcelPackage(fi))
            {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets.Add("Sheet1");
                // セルを指定して代入(ExcelVBA同様1から始まる)
                sheet1.Cells[1, 1].Value = "write time";
                sheet1.Cells[2, 1].Value = DateTime.Now.ToString("yyyy/MM/dd");
                sheet1.Cells[3, 1].Value = DateTime.Now.ToString("HH:mm:ss");
                pkg.Save();  // 保存。名前を変えて保存はSaveAs()
                sheet1.Dispose();
            }
            MessageBox.Show("出力OK!!");
        }

エクセルのVBAライクな書き方が可能ですね!
ExcelPackageはExcel全体の操作に使い、ExcelWorksheetで各セルへの操作が出来ます。

XLSXファイルの読み込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = False Then
         MessageBox.Show("ファイルなし")
         Return
      End If
      Dim strVal = String.Empty
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets("Sheet1")
         '// Valueでもよいが表示されている値をとりたければText'
         strVal = sheet1.Cells(2, 1).Text & Space(1) & sheet1.Cells(3, 1).Text 
         sheet1.Dispose()
      End Using
      MessageBox.Show(strVal)
   End Sub

C#

        private void button2_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == false) { MessageBox.Show("ファイルなし"); return; }
            var strVal = String.Empty;
            using (ExcelPackage pkg = new ExcelPackage(fi)) {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets["Sheet1"];
                // Valueでもよいが表示されている値をとりたければText
                strVal = sheet1.Cells[2, 1].Text + " " + sheet1.Cells[3, 1].Text;
                sheet1.Dispose();
            }
            MessageBox.Show(strVal);
        }

読み取りも書き込み同様にアクセスできます。

計算式やスタイル関連

171207_epplus_smple
▲画像のような書式設定をソースコードで書くと↓こんな感じです

続きを読む
スポンサードリンク
自己紹介
【管理人】
なみやん
【コメント】
プログラムを組むことが大好きな30代男性。IT系の仕事を10年ちょいやっています。このブログを通して知識を人に伝えることによって、自分をさらに磨こうと精進しています。応援よろしくお願いします。
免責事項
当サイトで紹介しているサンプルソースコードは自由に使用いただいても結構が、自己責任でお使いください。また、記事の内容が主観的であったり、努力していますが正しくなかったりする場合がございます。読者本人の判断にお任せいたします。