更新日付

最新投稿:大浦神社
投稿日:2026年4月13日
追記:吉備津彦神社
追記日:2026年5月7日
 火縄銃演武

2019年2月13日水曜日

C#からEXCEL読込(一括)

もう1年以上更新してなかったw

久しぶりに小ネタを。
アプリからEXCELファイルを読み込むってのは業務アプリ開発で
ありがちな依頼だったりする。

で、オイラもそんなC#開発依頼を受けて。

まず、参照設定にMicrosoft.Office.Interop.Excelを追加
(サードパーティ使用不可だからw)

以下、データ取得のソース
-----------------------------------------------------------------------------------------
            // データ格納エリア
            object[,] RangeDatas = null;
            Microsoft.Office.Interop.Excel.Application Exl = null;
            Microsoft.Office.Interop.Excel.Workbooks xlsBooks = null;
            Microsoft.Office.Interop.Excel.Workbook xlsBook = null;
            Microsoft.Office.Interop.Excel.Sheets xlsSheets = null;
            Microsoft.Office.Interop.Excel.Worksheet xlsSheet = null;
            Microsoft.Office.Interop.Excel.Range xlsRange = null;
            try
            {
                // EXCEL起動
                Exl = new Microsoft.Office.Interop.Excel.Application
                {
                    DisplayAlerts = false
                };
                try
                {
                    // Books指定
                    xlsBooks = Exl.Workbooks;
                    try
                    {
                        // Book読込
                        xlsBook = xlsBooks.Open(FILENAME);
                        try
                        {
                            //EXCEL Sheets
                            xlsSheets = xlsBook.Sheets;
                            try
                            {
                                //EXCEL Sheet(1シート目)
                                xlsSheet = xlsSheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
                                try
                                {
                                    //使用セル
                                    xlsRange = xlsSheet.UsedRange;
                                    RangeDatas = xlsRange.Value;
                                }
                                catch { }
                                finally
                                {
                                    if (xlsRange != null)
                                    {
                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsRange);
                                    }
                                    xlsRange = null;
                                }
                            }
                            catch { }
                            finally
                            {
                                if (xlsSheet != null)
                                {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsSheet);
                                }
                                xlsSheet = null;
                            }
                        }
                        catch { }
                        finally
                        {
                            if (xlsSheets != null)
                            {
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsSheets);
                            }
                            xlsSheets = null;
                        }
                    }
                    catch { }
                    finally
                    {
                        if (xlsBook != null)
                        {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsBook);
                        }
                        xlsBook = null;
                    }
                }
                catch { }
                finally
                {
                    if (xlsBooks != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsBooks);
                    }
                    xlsBooks = null;
                }
            }
            catch { }
            finally
            {
                if (Exl != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(Exl);
                }
                Exl = null;
            }

-----------------------------------------------------------------------------------------
使用したオブジェクトを明示的に開放してやらないと駄目なんで
めんどくさいけど仕方ない。
これでRangeDatasにEXCELセルのデータが入るのだけど・・・・

日付データとかは日付型で入るわけでもない。
EXCELに表示されている値を取り込みたいとなると
ループで各セルを回して.Textを取得する必要があるみたい。
(一括で取得する方法があれば良いけど・・・・)

2017年9月30日土曜日

ICD起動後の運転

9月にICD起動後の運転制限が1年から3ヶ月に短縮されたそうだ。

っていきなり3ヶ月かよwww

オイラ的には助かるのだが。。。。

自動運転付きとか制限を与えたほうが良い気もする。


2016年10月22日土曜日

久しぶりの投稿

いやいや、1年以上投稿してなかったなぁ。
去年末にICDがまた起動(朝、布団の中でドカンと)しまして・・・
また今年末まで運転はお預け。


仕事はぼちぼち。
この秋からSEのお手伝い。
無理を言って出社時間を遅らせてもらってます。
でも、車で行けないのは時間に縛られるのが辛いのと
運転で気分転換できないのもつらいなぁ。


また、技術的なネタも上げようかと思うけど
当分、COBOLでの作業だからねぇwww


COBOL,PL/I,JCLが読める人間なんて
50過ぎ初老のおっさんばっかり。

2015年8月18日火曜日

Windows10にしたらSQLServerExpressが・・・

テスト的にWindows7をWindows10に上げてみた。

今のところ問題さなそうに動いている。
心配だったVB2008(Express)も異常なし。

ただ、SqlServerExpress2012が接続できない。

起動してない?

SQLServer構成マネージャーで確認しようとすると・・・・ない?

と、思ったらコンピュータの管理から操作できました。

SQLServerが停止中になってる。
これを起動すれば接続できました。

とりあえず問題ないようなのでWindows7に戻さずに使ってみようかな。

2014年12月26日金曜日

IMEからカナを取得

IME入力時に読みを別コントロールに設定できる仕様を追加して欲しいとの事。


結局、流れた案件だけど、ある程度の調査結果でも書いておきます。


(たまには技術屋らしい書き込みもしないとねσ(^_^汗


調べると、IME用のAPIを使うとの事。
で、WndProcをOverridesして操作が常道らしい。


まず、ModuleにAPI等を定義
------------------------------------------------------------
Imports System.Runtime.InteropServices


Public Module TestFuncs
#Region "API定数"
    ''' <summary>WindowMessage:WM_CHAR</summary>
    Public Const WM_CHAR As Integer = &H102
    ''' <summary>WindowMessage:WM_IME_COMPOSITION</summary>
    Public Const WM_IME_COMPOSITION As Integer = &H10F
    ''' <summary>ImmGetCompositionString用定数:GCS_RESULTREADSTR</summary>
    Public Const GCS_RESULTREADSTR As Integer = &H200
#End Region
#Region "API定義"
    ''' <summary>IMEハンドル取得</summary>
    <DllImport("Imm32.dll")> _
    Public Function ImmGetContext(ByVal hWnd As Integer) As Integer
    End Function
    ''' <summary>IMEハンドル解放</summary>
    <DllImport("Imm32.dll")> _
    Public Function ImmReleaseContext(ByVal hWnd As Integer, ByVal hIMC As Integer) As Integer
    End Function
    ''' <summary>フリガナ取得</summary>
    <DllImport("Imm32.dll")> _
    Public Function ImmGetCompositionString(ByVal hIMC As Integer, ByVal dwIndex As Integer, ByVal lpBuf As StringBuilder, ByVal dwBufLen As Integer) As Integer
    End Function
    ''' <summary>IME状態取得</summary>
    <DllImport("Imm32.dll")> _
    Public Function ImmGetOpenStatus(ByVal hIMC As Integer) As Integer
    End Function
#End Region
End Moudle
------------------------------------------------------------


あとはテキストボックス継承のコントロールを作成
------------------------------------------------------------
Imports System.ComponentModel


Public Class TestTextBox
    Inherits System.Windows.Forms.TextBox


    ''' <summary>読み設定先</summary>
    Private _YomiControl As Control = Nothing


    ''' <summary>読み設定先コントロール</summary>
    <Category("カスタム")> _
    <Description("読み設定先コントロール")>
    Public Property YomiControl() As Control
        Get
            Return _YomiControl
        End Get
        Set(ByVal value As Control)
            _YomiControl = value
        End Set
    End Property


#Region "WndProcフック"
    ''' <summary>ウィンドウプロシージャ</summary>
    Protected Overloads Overrides Sub WndProc(ByRef wm As System.Windows.Forms.Message)
        Try
            If Not _YomiControl Is Nothing Then
                Select Case wm.Msg
                    Case WM_IME_COMPOSITION
                        'IME確定
                        Dim InpStr As String = ""
                        If (CUInt(wm.LParam) And CUInt(GCS_RESULTREADSTR)) <> 0 Then
                            Dim hIM As Integer = ImmGetContext(Me.Handle.ToInt32())
                            Dim strLen = ImmGetCompositionString(hIM, GCS_RESULTREADSTR, Nothing, 0)
                            If strLen > 0 Then
                                Dim temp As New System.Text.StringBuilder(strLen)
                                ImmGetCompositionString(hIM, GCS_RESULTREADSTR, temp, strLen)
                                InpStr = temp.ToString()
                                If InpStr.Length > strLen Then
                                    InpStr = InpStr.Substring(0, strLen)
                                End If
                                Try
                                    If Not _YomiControl Is Nothing Then
                                        _YomiControl.Text = _YomiControl.Text & StrConv(InpStr, VbStrConv.Wide)
                                    End If
                                Catch ex As Exception
                                End Try
                            End If
                            ImmReleaseContext(Me.Handle.ToInt32(), hIM)
                        End If
                        Exit Select
                    Case WM_CHAR
                        '直接入力
                        Dim hIM As Integer = ImmGetContext(Me.Handle.ToInt32())
                        If ImmGetOpenStatus(hIM) = 0 Then
                            Dim InpChr As Char = Convert.ToChar(wm.WParam.ToInt32() And &HFF)
                            If wm.WParam.ToInt32() >= 32 Then
                                Dim InpStr As String = InpChr.ToString()
                                Try
                                    If Not _YomiControl Is Nothing Then
                                        _YomiControl.Text = _YomiControl.Text & InpStr
                                    End If
                                Catch ex As Exception
                                End Try
                            End If
                        End If
                        ImmReleaseContext(Me.Handle.ToInt32(), hIM)
                        Exit Select
                End Select
            End If
        Catch ex As Exception
        End Try
        MyBase.WndProc(wm)
    End Sub
#End Region
End Class
------------------------------------------------------------
とりあえずカナを取得して、指定の別コントロールに設定するソース。


2時間程度で調べて作ったものなのでバグ等があるやもしれませんがw