2012-03-12 136 views
1

我在使用C#编写Excel电子表格时遇到了一些麻烦。 我有这样的代码,我读出每一个细胞,从A到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,所以我想读(GHIJ) 若F的单元格的值是2的我想读取(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

请减少代码示例中的缩进量,以便我们不必滚动以阅读代码。 – 2012-03-12 17:47:09

+0

哈哈。或者我们可以简单地编辑他的帖子... – code4life 2012-03-12 17:54:52

+0

这是否与你几个小时前在http://stackoverflow.com/questions/9668178/reading-data-from-an-excel-spreadsheet中提出的问题有实质性的不同? – 48klocs 2012-03-12 18:02:05

回答

2

这是.NET 4.0:

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而不是从零开始)。如果解析成功,我们再将这个数字乘以4,看看你需要多少列(在你的文章中你说过行,但你的例子是列)。我们使用for循环在G列(第7列)处开始并转到列数以读取+7(以说明我们跳过的列)。你可以自由地做你想要的值,但对于这个例子,我只是写了他们到控制台。

+0

您的代码会引发此错误:无法对空引用执行运行时绑定! – Vlasin 2012-03-13 08:48:49

+0

@Vlasin - 我很抱歉,在写之前我没有测试过它。我已经修复了代码,我只是自己测试它,现在它应该适用于你。代码很好, – Jetti 2012-03-13 12:53:21

0

这是inot直接回答你的问题,但ÿ OU可以轻松地参考您的细胞是这样的:

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 2012-03-12 18:04:31

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

。解释为什么它是好的!你可以这样做吗? – 2015-08-03 09:11:56