2012-03-11 30 views
0

C#でエクセルから読み込み中に問題が発生しています。 私は私の質問があるXにExcelからセルを読み込む

  int i = 1; 
      int number; 
      System.Array myvalues; string[] strArray; 
      Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString()); 
      while(range.Count!=0) 
      { 
        i++; 
        range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString()); 
        myvalues = (System.Array)range.Cells.Value; 
        strArray = ConvertToStringArray(myvalues); 
        number = Convert.ToInt32(strArray[0]); 
      } 

からすべてのセルを読んで、このコードを持っている:私は「数」の値に基づいて、Excelで次の4 *「数」の行を読むことができるどのように?

  A B C D E F G H I J 
     a a a a a 1 a a a a 

Fのセルの値が1で私はFのセルの値iが読みたい2である場合 を(GHIJ)を読みたいです(GHIJKLMN)

  A B C D E F G H I J K L M N 
     a a a a a 2 a a a a a a a a 
:例えば

Fのセル値3:

 A B C D E F G H I J K L M N O P Q R 
     a a a a a 3 a a a a a a a a a a a a 

答えて

0

コード:

int i = 1; 
do 
{ 

    i++; 
    var range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString()); 
    if (range.Count != 0) 
    { 
     var myvalues = (System.Array)range.Cells.Value; 
     var strArray = ConvertToStringArray(myvalues); 
     var number = Convert.ToInt32(strArray[0]); 
     MyMethodReadRage(worksheet, number); 
    } 

} while(range.Count!=0); 

読み取り範囲のための方法:

void MyMethodReadRage(Microsoft.Office.Interop.Excel.Worksheet worksheet, int numberRows) 
{ 
    var range = worksheet.get_Range("A" + numberRows, "X" + (numberRows + 4)); 
    /*code*/ 
} 

EDIT

は、列の値を読み取り"F"は、値を4ずつ増加させ、前の列の量を加算します( "F"まで)。次に、この(証明されていない)この関数を使用して文字を取得します。

/// <summary> 
    /// http://www.freevbcode.com/ShowCode.asp?ID=4303 
    /// </summary> 
    private string ColumnLetter(int ColumnNumber) 
    { 
     if (ColumnNumber > 26) 
     { 
      return string.Format("{0}{1}", (char)(Convert.ToInt32((ColumnNumber - 1)/26) + 64), (char)(((ColumnNumber - 1) % 26) + 65)); 
     } 
     else 
     { 
      return string.Format("{0}", (char)(ColumnNumber + 64)); 
     } 
    } 

EDIT II

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplicationExcelCeldas 
{ 
    class Program 
    { 
     private const int NumberPositionColumnF = 6; 

     static void Main(string[] args) 
     { 
      Microsoft.Office.Interop.Excel.Worksheet worksheet = new Microsoft.Office.Interop.Excel.Worksheet(); 

      var i = 0; 
      var test = new TestExcel(); 
      do 
      { 
       i++; 
       var rangeF = worksheet.get_Range(string.Format("F{0}" , i)); 
       if (rangeF.Count == 0) 
       { 
        break; 
       } 

       var values = test.GetCellsStringArray(rangeF); 
       if (values.Count() > 0) 
       { 
        int number = 0; 
        if (int.TryParse(values[0], out number)) 
        { 
         var rangeAll = worksheet.get_Range(
          string.Format("A{0}" , i), 
          string.Format("{0}{1}", test.ColumnLetter(Program.NumberPositionColumnF + (number * 4)), i)); 


         /* 
         your code for work with rangeAll 
         */ 
        } 
       } 

      } while (true); 
     } 
    } 

    class TestExcel 
    { 
     internal string[] GetCellsStringArray(Microsoft.Office.Interop.Excel.Range range) 
     { 
      var myvalues = (System.Array)range.Cells.Value; 
      return this.ConvertToStringArray(myvalues); 
     } 

     internal string[] ConvertToStringArray(System.Array values) 
     { 
      string[] theArray = new string[values.Length]; 
      for (int i = 1; i <= values.Length; i++) 
      { 
       if (values.GetValue(1, i) == null) 
        theArray[i - 1] = ""; 
       else 
        theArray[i - 1] = (string)values.GetValue(1, i).ToString(); 
      } 
      return theArray; 
     } 

     internal string ColumnLetter(int columnNumber) 
     { 
      if (columnNumber > 26) 
      { 
       return string.Format("{0}{1}", (char)(Convert.ToInt32((columnNumber - 1)/26) + 64), (char)(((columnNumber - 1) % 26) + 65)); 
      } 
      else 
      { 
       return string.Format("{0}", (char)(columnNumber + 64)); 
      } 
     } 
    } 
} 
+0

セルが "X"であるかどうかわかりません。私はちょうど "番号"が "W"セルに保存されていることを知っています。私は4のブロックを持っているかもしれませんが、私は(4 * 4 * 4) – Vlasin

+0

を意味し、あなたはExcelの例を入れて、望ましい結果になるでしょうか? –

+0

はい!私は私の質問を変更しました... – Vlasin

0

こんにちは私はこのコードを作成します(最新のMicrosoft Libの相互運用機能DLLの.NETネイティブたいと、それは最初の列からすべての行を通して行くあなたはそれを変更することができますlib)それはあなたが助けてくれるとうまくいきます。

 int sheetIndex = 1; //PLEASE NOTE THIS LIB WORKS WITH NON-ZERO BASED INDEX 
     string excelFilePath = "your_path/your_excel_file.xls"; 
     List<string> yourList = new List<string>(); 
     Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Microsoft.Office.Interop.Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);    
     Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[sheetIndex]; 
     Microsoft.Office.Interop.Excel.Range rangeSelection = worksheet.Columns[1]; 

     foreach (Microsoft.Office.Interop.Excel.Range row in rangeSelection.Rows) 
     { 
      Microsoft.Office.Interop.Excel.Range cell = (Microsoft.Office.Interop.Excel.Range)row.Cells[1, 1]; 
      if (cell.Value2 != null) 
       list.Add(cell.Value2.ToString()); 
     } 
関連する問題