【问题标题】:C# iterate over a row in ExcelC#遍历Excel中的一行
【发布时间】:2013-08-11 10:37:04
【问题描述】:

我需要遍历特定的 Excel 行。现在我有一个迭代列的代码,我希望它与此类似。它看起来像这样:

int columnLength = xlWorkSheet.UsedRange.Rows.Count;
string lastCell = Regex.Replace(CONST_FIRST_CELL, @"\d+", columnLength.ToString()); //will give me the last cell in the column
var excelColumn = xlWorkSheet.Range[CONST_FIRST_CELL, lastCell ];
    if (excelColumn == null)
    {
      throw new Exception("bad col");
    }
    for (int i = 1; i < columnLength ; i++)
    {
      Excel.Range currentValue = excelColumn [i];
      ....DO SOME STUFF....
    }

如何迭代特定的行?我不确定如何获得最后一列,就像我在上面的实现中得到最后一行单元格一样,从那时起我只需要用长度切换一个数字,但现在我需要以某种方式获取正确的最后一行单元格(其中意味着以某种方式切换字母,即 C4 到 AD4) 以获得第一个单元格行和最后一个单元格的范围...

我猜最好的解决方案是以某种方式涉及一个 foreach 循环?

【问题讨论】:

  • 请告诉我们您使用什么库从 Excel 中读取,例如 OpenXml / Office dll 等。
  • 您的代码有点混乱。您正在定义称为“列”的变量并为它们分配行值。另外,我不确定您通过正则表达式获得最后一个单元格的方式。你能解释一下你想要完成什么吗?只是遍历行?另外,根据 saravanan 的建议,请告诉您正在使用的特定库;我认为这是互操作连接,但也许不是;什么可以解释你的代码中我不理解的一些部分。
  • @saravanan 我正在使用 .NET 的 Microsoft.Office.Interop.Excel
  • @varocarbas 我有一个特定的行,例如第 5 行,现在我想遍历该行中的每个单元格并获取当前单元格的内容。跨度>
  • 更清楚的是,我已经写了一个答案,包括在循环中完成所需的更正以完成您所追求的 -> 给定行中从 startCol 到 maxCol 的所有单元格的范围(和值)列。

标签: c# excel


【解决方案1】:

你快到了,你的循环只需要一些调整:

  //Input all the Int values you want
  int targetRow = 1; 
  int startCol = 1;
  int maxCol = 10; //With this value the loop below will iterate until column 9 (inclusive)
  for (int i = startCol; i < maxCol ; i++)
  {
      Excel.Range currentRange = (Excel.Range)xlWorkSheet.Cells[targetRow, i];
      if (currentRange.Value2 != null)
      {
          string curVal = currentRange.Value2.ToString();
      }
  }

IMO 这是迭代单元格的最佳方式(通过考虑行和/或列)。您可以以不同的方式进行操作(根据您尝试的方式):在给定范围的列中进行迭代(您需要将范围定义为 Excel.Range 类型,然后依赖内置属性 Columns) ,尽管我认为这可能会更令人困惑。示例:如果您有输入范围 C1:H5,“C:C”是第一列,“D:D”是第二列,依此类推。使用我的方法,第一列将始终为“A:A”,第二列“B:B”等

遍历给定范围内的列的示例 (inputRange):

foreach(Excel.Range curCol in inputRange.Columns)
{
    if (curCol.Value2 != null) 
    {
       //As far as each column only has one row, each column can be associated with a cell
        string curVal = curCol.Value2.ToString();
    }
}

【讨论】:

  • 工作表的Cells属性和Range属性有什么区别?而且你不需要给它一系列特定的单元格吗?
  • @YonatanNir 我现在已经准确地更新了我的答案,并在这方面进行了澄清:使用单元格(来自工作表),您可以获得列索引的绝对参考:1 将始终与 A 列相关联。阅读我的评论,让我知道您的印象。
  • 所以让我们看看我是否正确理解了......我过去在我的代码中迭代列的方式非常适合当你有一个特定的起始单元格和一个结束单元格时,你的方法是尝试从一开始就迭代整行/列以及想要多少单元格时会更好吗?并且单元格属性因此接收,而不是特定开始和结束单元格的范围,而只是一行和一列?什么是“C:C”?我知道这是“C”列,但另一个“C”代表什么?
  • @YonatanNir 我已经重新更新了我的答案,以显示与您尝试的内容相符的内容。看,您可以通过多种方式定义范围: Range("A1") = Cells[1, 1] (以及许多其他选项)。在遍历 Columns 时,您可能更喜欢第二个选项,因为它比处理字母更容易。最重要的是,您拥有列/行集合(它们都不依赖字母)...
  • @YonatanNir 你提出的和我提出的区别不是定义/迭代范围的方式(最后基本上是相同的),而是原始范围是什么作为参考。在您的情况下,您将自己定义的范围作为参考(如上所述,不需要从 A1 开始);就我而言,我采用默认电子表格范围(始终从 A1 开始)。这是您的方法和我的方法(或我的第一个代码和我的第二个代码之间)的主要区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多