2017-06-07 19 views
0

Excel interopライブラリなしでExcelファイルをDataTableに読み込んでいます。 DataTableから私はいくつかの値とそのアドレスをExcelと比較して調べる必要があります。C#Interop DLLなしで行番号と列番号からExcellセルアドレスを作成

例dt.Rows [7] .ItemArray [1] .ToString()の値がわかりましたので、excelのアドレスは "B8"にしてください。

DataTableのセルアドレスをExcelのセルアドレスに変換する必要があるように、

ここに私のコードは、Excelファイルを読み取るために使用されます。

public DataTable getExcelSheet(string filePath, string sheetName) 
    { 
     var ds = new DataSet(); 
     var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ; 
     using (var conn = new OleDbConnection(connectionString)) 
     { 
      conn.Open(); 

      var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
      using (var cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = "SELECT * FROM [" + sheetName + "] "; 

       var adapter = new OleDbDataAdapter(cmd); 
       ds = new DataSet(); 
       adapter.Fill(ds); 
      } 
      conn.Close(); 
     } 
     return ds.Tables[0]; 
    } 

この関数は、データテーブル

public String getTablePosition(DataTable dataTable, String value) 
     { 
      string cell = ""; 
      for (int rows = 0; rows < (dataTable.Rows.Count < 100 ? dataTable.Rows.Count : 100); rows++) 
      { 
       for (int cols = 1; cols < (dataTable.Columns.Count < 100 ? dataTable.Columns.Count : 100); cols++) 
       { 
        if (dataTable.Rows[rows].ItemArray[cols].ToString() == value) 
        { 
         return "" //here cell I need cell address like B8 or CQ15 
        } 
       } 
      } 
      return ""; 
     } 

からの値は、誰もがこの中で私を助けることができる見つけることですか?私はExcelのinteropライブラリを使用せずにこれを行う必要があります。

+0

何をしますか?列を繰り返しますか?または、値に基づいてセルを選択しますか? – FortyTwo

+0

関数getTablePosition()を参照してください。これは、データテーブルから値を見つけます。セルが一致すると、そのアドレスがExcelの形式で欲しいと思います。 例dt.Rows [7] .ItemArray [1] .ToString()の値が、B8のアドレスを返すよりも大きかった。 –

+0

あなたのクエリ 'SELECT * FROM [MySheet $ A1:C20]'を更新してください。これで、ヘッダーが有効か無効かに応じて列と行のインデックスを計算できるように範囲がわかりました。 – FortyTwo

答えて

-1

私は列と行番号に基づいてセルアドレスを作成する関数を作成しました。

 string[] Columns = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; 

public String getExcelAddress(int row, int column) 
     { 
      string cellAddress = ""; 
      cellAddress = ((column/26) - 1 >= 1 ? Columns[(column/26) - 1] : "") + Columns[column % 26] + (row + 1); 
      return cellAddress; 
     } 

     public String getTablePosition(DataTable dataTable, String value) 
     { 
      for (int rows = 0; rows < (dataTable.Rows.Count < 100 ? dataTable.Rows.Count : 100); rows++) 
      { 
       for (int cols = 1; cols < (dataTable.Columns.Count < 100 ? dataTable.Columns.Count : 100); cols++) 
       { 
        if (dataTable.Rows[rows].ItemArray[cols].ToString().Trim() == value.Trim()) 
        { 
         return getExcelAddress(rows, cols); 
        } 
       } 
      } 
      return ""; 
     } 
+0

列Aまたはそれ以前の列が空の場合は、間違った参照をします。 'HDR = Yes'や最初のいくつかの行が空白の場合にも間違った参照を与えます。 – FortyTwo

+0

HDR =はいとは何ですか? –

+0

[Excel接続文字列](https://www.connectionstrings.com/excel/)を読むことができます。 – FortyTwo

関連する問題