2012-03-12 23 views
1

C#のExcelスプレッドシートから読み込みに問題があります。 私は私の質問があるXにExcelファイルからデータを読み取る

System.Array myvalues; string[] strArray; 
Microsoft.Office.Interop.Excel.Range range = 
    worksheet.get_Range("A" + i.ToString(), "W" + i.ToString()); 

while(range.Count!=0) 
{ 
    i++; 
    //Console.WriteLine(i); 
    range = worksheet.get_Range("A" + i.ToString(), "W" + i.ToString()); 
    myvalues = (System.Array)range.Cells.Value; 
    strArray = ConvertToStringArray(myvalues); 
    name = clearstr(strArray[1]); 

    for (int j = 1 ; j <= Int32.Parse(number_add_file)*4 ; j++) 
    { 
     name = ""; 
     lang_add = ""; 
     price = ""; 
     description = ""; 
     Console.WriteLine("I got in!"); 

     Microsoft.Office.Interop.Excel.Range range_add = 
      worksheet.get_Range("X" + i.ToString(),Type.Missing); 

     System.Array values = (System.Array)range_add.Cells.Value; 
     string[] str = ConvertToStringArray(values); 
     name = str[0]; 
     lang_add = str[1]; 
     price = str[2]; 
     description = str[3]; 
     Console.WriteLine(name + " " 
      + lang_add + " " + price + " " + description); 

     addfile(); 
    } 

からすべてのセルを読んで、このコードを持っている:私は「数」の値に基づいて、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のセルの値は、私が読みたい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

コードサンプルのインデントを減らし、コードを読むためにスクロールする必要がないようにしてください。 –

+0

LOL。または、単に彼のための投稿を編集することができます... – code4life

+0

これは数時間前にあなたが質問した質問と実質的に異なっていますか?http://stackoverflow.com/questions/9668178/reading-data-from-an-excel-spreadsheet ? – 48klocs

答えて

2

これは、.NET 4.0用です::OUには、簡単にこのようなあなたのセルを参照することができ

using Excel = Microsoft.Office.Interop.Excel; 
Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("somefile.xls"); 
Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1]; // assume it is the first sheet 
Excel.Range xlRange = xlWorksheet.UsedRange; // get the entire used range 
int value = 0; 
if(Int32.TryParse(xlRange.Cells[1,6].Value2.ToString(), out value)) // get the F cell from the first row 
{ 
    int numberOfColumnsToRead = value * 4; 
    for(int col=7; col < (numberOfColumnsToRead + 7); col++) 
    { 
     Console.WriteLine(xlRange.Cells[1,col].Value2.ToString()); // do whatever with value 
    } 
} 

これは、ブックを開くと、ブックの最初のワークシートを取得します。次に使用範囲全体を取得し、範囲変数に設定します。そこから、最初の行にある列 "F"(6番目の列、1はゼロではないことに基づいています)のintを解析しようとします。解析が成功した場合は、その数に4を掛けて必要な列の数を確認します(行に書いたポストでは、列は例です)。 forループをG列(列7)から開始し、読み込む列数+ 7(スキップした列を考慮して)に移動します。値を使って自由に行うことができますが、この例ではコンソールに書き込んだだけです。

+0

あなたのコードからこのエラーが返されます:null参照で実行時バインディングを実行できません! – Vlasin

+0

@Vlasin - 私は謝ります、私はそれを書く前にそれをテストしていませんでした。私はコードを修正して、私はそれを自分でテストしたところ、今すぐあなたのために働くはずです。 – Jetti

0

それはあなたの質問にinot直接の答えですが、Y

int row1 = 1; 
int row2 = 5; 

sheet1.Cells[row1, row1+row2].Value=row1.ToString(); 
String Rng = Convert.ToString(sheet1.Cells[row1, row2-row1].Address()); 
+0

全く関係ありません... – Vlasin

0
string testList = ""; 
      String str1 = ""; 
      string logPath = @"E:\LogForConsoleApp.txt"; 
      string filePath = @"E:\SaveSheetName.txt"; 
      string Path = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest"; 
      List<string> ltSheetName = new List<string>(); 
      List<string> ltMethodName = new List<string>(); 
      Process myProcess = new Process(); 
      Excel.Application appExl = new Excel.Application(); 
      Excel.Workbook workbook = null; 
      Excel.Worksheet NwSheet; 
      Excel.Range ShtRange; 
      appExl = new Excel.Application(); 
      workbook = appExl.Workbooks.Open("E:\\inputSheet3", Missing.Value, ReadOnly: false); 
      NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); 
      ShtRange = NwSheet.UsedRange; //gives the used cells in sheet 
      int rCnt = 0; 
      int cCnt = 0; 

      for (rCnt = 1; rCnt <= ShtRange.Rows.Count; rCnt++) 
      { 
       for (cCnt = 1; cCnt <= ShtRange.Columns.Count; cCnt++) 
       { 
        if (Convert.ToString(NwSheet.Cells[rCnt, cCnt].Value2) == "Y") 
        { 
         ltSheetName.Add(NwSheet.Cells[rCnt, cCnt - 1].Value2); 
         //ltMethodName.Add(" /test:" + NwSheet.Cells[rCnt, cCnt - 1].Value2); 
        } 
       } 
      } 
      workbook.Close(false, Missing.Value, Missing.Value); 
      appExl.Quit(); 

      for (int sht = 0; sht < ltSheetName.Count; sht++) 
      { 
       ltMethodName.Clear(); 
       appExl = new Excel.Application(); 
       workbook = appExl.Workbooks.Open(ltSheetName[sht].ToString(), Missing.Value, ReadOnly: false); 
       NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); 
       ShtRange = NwSheet.UsedRange; //gives the used cells in sheet 
       int rCnt1 = 0; 
       int cCnt1 = 0; 

       for (rCnt1 = 1; rCnt1 <= ShtRange.Rows.Count; rCnt1++) 
       { 
        for (cCnt1 = 1; cCnt1 <= ShtRange.Columns.Count; cCnt1++) 
        { 
         if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1].Value2) == "Y") 
         { 
          ltMethodName.Add(" /test:" + NwSheet.Cells[rCnt, cCnt - 1].Value2); 
         } 
        } 
       } 
       workbook.Close(false, Missing.Value, Missing.Value); 
       appExl.Quit(); 


       for (int i = 0; i < ltMethodName.Count; i++) 
       { 
        str1 = ltMethodName[i].ToString(); 
        testList += str1; 
       } 

       string foldername = "TestResult_" + DateTime.Today.ToString().Remove(DateTime.Today.ToString().LastIndexOf("/") + 5); 
       foldername = foldername.Replace("/", ""); 

       string direc = @"E:\" + foldername; 
       string fileName = ltSheetName[sht].ToString().Substring(ltSheetName[sht].ToString().LastIndexOf("\\") + 1) + "_InderdeepAutRes.trx"; 
       if (!Directory.Exists(direc)) 
        Directory.CreateDirectory(direc); 
       string testcase = ""; 

       if (!File.Exists(direc + "\\" + fileName)) 
        testcase = " /testcontainer:" + "E:\\Practice\\TestingSample\\TestingSample\\bin\\Debug\\TestingSample.dll" + testList + " /resultsfile:" + direc + "\\" + fileName; 
       else 
       { 
        Directory.Delete(direc, true); 
        Directory.CreateDirectory(direc); 
        testcase = " /testcontainer:" + "E:\\Practice\\TestingSample\\TestingSample\\bin\\Debug\\TestingSample.dll" + testList + " /resultsfile:" + direc + "\\" + fileName; 
       } 

       ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(Path, testcase); 

       try 
       { 
        TextWriter tw = new StreamWriter(filePath, false); 
        tw.WriteLine(ltSheetName[sht].ToString()); 
        tw.Close(); 
        myProcess.StartInfo = myProcessStartInfo; 
        myProcessStartInfo.UseShellExecute = false; 
        myProcessStartInfo.RedirectStandardOutput = true; 
        myProcess.Start(); 
        string output = myProcess.StandardOutput.ReadToEnd(); 
        //myProcess.WaitForExit(); 
        Console.WriteLine(output); 

       } 
       catch (Exception ex) 
       { 
        TextWriter tw = new StreamWriter(logPath, true); 
        tw.WriteLine(ex.StackTrace); 
        tw.Close(); 
       } 
      } 
+0

コードが良いです。なぜそれが良いの説明素晴らしいです!どうかできますか? –

関連する問題