2017-04-13 22 views
0

私は、Excelプロジェクトをアップロードし、行ごとにオブジェクトに変換する.NETプロジェクトを用意しています。これは正常に動作します。1つの列挙型または別の列挙型を指す変数?

私はそうと、列

から値を取得する必要がありますExcelファイルとその列のインデックス内のカラムの間のマッピングを作成するための列挙を定義した:

Public Enum ColumnIndexEnum 
     FirstName = 1 
     LastName = 2 
     Address = 3 
     ... 
End Enum 

これは、このように使用されています。私は、新しい列を入力するために、過去に列挙型を使用していた

Dim row = 1 
    WorkSheet.GetValue(ColumnIndexEnum.FirstName, row) 

(擬似コード)。新しいエントリを入力して列挙型を編集するだけで、特定の列を読み取るコードを変更する必要はありません。

ここで、いくつかの列が消えるように変更する必要があります。他のケースではリターン。つまり、FirstName列が最初の列(インデックス1)になることがあり、それ以外のときには2番目の列になることがあります。

そして、私はこれに最善のアプローチをしています。 2番目の列挙型を作成し、使用する列挙型を切り替えることを考えていましたが、1つの列挙型または別の列挙型を指す変数をどのように作成するかについての詳細はわかりません。

誰にもこれに関するアイデアはありますか?私はこのプロジェクトにVB.NETを使用します。

答えて

1

あなたはこのようにヘルパー関数でこれを行うことができます:

Public Enum ColumnIndexEnum 
    FirstName = 1 
    LastName = 2 
    Address = 3 
    ... 
End Enum 

Public Enum ColumnType 
    FirstType = 1 
    SecondType = 2 
    ... 
End Enum 

Public Function GetColumn(ByVal col As ColumnIndexEnum, ByVal colType As ColumnType) As Integer 
    Select Case col 
     Case ColumnIndexEnum.FirstName 
      If colType = ColumnType.FirstType Then 
       Return 1 
      ElseIf colType = ColumnType.SecondType Then 
       Return 2 
      End If 
     Case ColumnIndexEnum.SecondName 
      If colType = ColumnType.FirstType Then 
       Return 2 
      ElseIf colType = ColumnType.SecondType Then 
       Return 3 
      End If 
     ... 
    End Select 
End Function 

は、その後、あなたがそのように使用することができます。

Dim row = 1 
WorkSheet.GetValue(GetColumn(ColumnIndexEnum.FirstName,ColumnType.FirstType), row) 
+0

これは私がやったことです。ありがとうございます!しかし、ただ一つの小さなこと。 GetColumnメソッドでは、列の名前(タイトルではなく、バックエンドで使用する名前)である文字列を取ることができました。これは、Enum.TryParseを使って時間に応じて正しい列挙型に解析しようとします。だから私の解決策はあなたのものより少し短かった。 あなたの提案は正しい軌道に乗ったので、ありがとう! –

1

「1つの列挙型または別の列挙型を指す変数」を持つことはできません。第一に、それは型付き言語であり、第二に、参照型ではないからです(指すことができる)。列インデックスは、列挙型を整数(または列挙型のバッキングタイプが何であれ)にキャストするだけで簡単に格納できます。その日の終わりには、enumが実際にあなたのためにやっていることです。いくつかの数値のエイリアスを与え、キャストすることで、その基礎となる値を得ることができます。

1

これは、列挙型を使用して整数値に読み取り可能な名前を付けるだけなので、構造的な問題です。

Public Enum ColumnIndexEnum 
    FirstName = 1 
    LastName = 2 
    Address = 3 
    ... 
End Enum 

を、今あなたがFIRSTNAME列2である別のExcel形式を持っており、タイトルは次のように1列です::だから

Public Enum ColumnIndexEnum2 
    Title = 1 
    FirstName = 2 
    LastName = 3 
    Address = 4 
    ... 
End Enum 

は、既存のExcel形式は、あなたがそれを置くようであると言うことができますはい、好きなように新しい列挙型を作成して使用することができます。しかし、私は個人的にはEPPlusやCSVReaderのnugetパッケージを自分で使っています。なぜなら、特定の列の順序に頼る必要がなく、列の名前を指定した値を読み取ることができるからです。あなたが列の名前を持っていないならば、その別の話。

+0

私はEPPlusも使用しています。名前で列を読むことはできますか?私はこれを知らなかった!どうやって知っていますか?ほとんどの例ではインデックス整数を使用しています。 –

+0

はい、ありがとうございます。http://stackoverflow.com/questions/39958798/epplus-find-column-using-column-name – Digvijay

0

Public Enum ColumnIndexEnum 
    FirstName = 1 
    LastName = 2 
    Address = 3 
End Enum 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim row = 1 
    WorkSheet.GetValue(ColumnIndexEnum.FirstName, row) 
End Sub 

Step1-変更名ここで開始しますenumの

Public Enum ColumnIndexGetter 
    FirstName = 1 
    LastName = 2 
    Address = 3 
End Enum 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim row = 1 
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row) 
End Sub 

ステップ2(すべての名前を変更するために赤いアンダースコアを使用) - 列挙

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim row = 1 
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row) 
End Sub 

ステップ3を取り除く - ケースのための新しい変数

Private ColumnIndexGetter As Cases 

とクラスを定義します。実際の状況に合わせてこれを変更する必要があります。うまくいけば、あなたはそのアイデアを得るでしょう。

Public Class Cases 
    Private Enum ColumnIndexCase1 
     FirstName = 1 
     LastName = 2 
     Address = 3 
    End Enum 

    Private Enum ColumnIndexCase2 
     FirstName = 2 
     LastName = 3 
     Address = 7 
    End Enum 

    Private _whCase As Integer 
    Public Sub New(WhichCase As Integer) 
     Me._whCase = WhichCase 
    End Sub 

    Public Function FirstName() As Integer 
     Dim rv As Integer = 0 
     Select Case Me._whCase 
      Case 1 
       rv = ColumnIndexCase1.FirstName 

      Case 2 
       rv = ColumnIndexCase2.FirstName 

     End Select 
     Return rv 
    End Function 

    Public Function LastName() As Integer 
     Dim rv As Integer = 0 
     Select Case Me._whCase 
      Case 1 
       rv = ColumnIndexCase1.LastName 

      Case 2 
       rv = ColumnIndexCase2.LastName 

     End Select 
     Return rv 
    End Function 

    Public Function Address() As Integer 
     Dim rv As Integer = 0 
     Select Case Me._whCase 
      Case 1 
       rv = ColumnIndexCase1.Address 

      Case 2 
       rv = ColumnIndexCase2.Address 

     End Select 
     Return rv 
    End Function 
End Class 

最後に、ColumnIndexGetterを使用する前に、あなたが

ColumnIndexGetter = New Cases(1) 
    'or 
    ColumnIndexGetter = New Cases(2) 

をする必要がありますし、どこで、コードが

Private ColumnIndexGetter As Cases 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    ColumnIndexGetter = New Cases(1) 
    'or 
    ColumnIndexGetter = New Cases(2) 

    Dim row = 1 
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row) 
End Sub 

のようになります。ColumnIndexGetterの初期化の実際の位置は、おそらくになりますどの場合に対処しているか知っています。