C# 从Excel中读取单元格

C# 从Excel中读取单元格,c#,winforms,excel,C#,Winforms,Excel,我在读c#中的exel时遇到了一些麻烦。 我有这个代码,我从A到X读取每个单元格 int i = 1; int number; System.Array myvalues; string[] strArray; Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToS

我在读c#中的exel时遇到了一些麻烦。 我有这个代码,我从A到X读取每个单元格

            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,所以我想读取(G H i J) 如果F的单元格值为2,则我希望读取(G H i J K L M N)

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

我不知道你为什么要逐行阅读。读取4行的范围,然后解析二维值数组可能更好

请看这篇文章:

代码:

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*/
}
编辑

读取列“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));
        }
    }
//
/// http://www.freevbcode.com/ShowCode.asp?ID=4303
/// 
私有字符串ColumnLetter(int ColumnNumber)
{
如果(列数>26)
{
返回string.Format(“{0}{1}”,(char)(Convert.ToInt32((ColumnNumber-1)/26)+64),(char)((ColumnNumber-1)%26)+65));
}
其他的
{
返回string.Format(“{0}”,(char)(ColumnNumber+64));
}
}
编辑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));
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序ExcelCeldas
{
班级计划
{ 
private const int NumberPositionColumnF=6;
静态void Main(字符串[]参数)
{
Microsoft.Office.Interop.Excel.Worksheet Worksheet=新的Microsoft.Office.Interop.Excel.Worksheet();
var i=0;
var test=新的TestExcel();
做
{
i++;
var rangeF=worksheet.get_Range(string.Format(“F{0}”,i));
如果(rangeF.Count==0)
{
打破
}
var值=test.GetCellsStringArray(rangeF);
if(values.Count()>0)
{
整数=0;
if(int.TryParse(值[0],输出编号))
{
var rangeAll=工作表。获取范围(
格式(“A{0}”,i),
string.Format(“{0}{1}”,test.ColumnLetter(Program.NumberPositionColumnF+(number*4)),i));
/*
使用rangeAll的代码
*/
}
}
}虽然(正确);
}
}
类TestExcel
{
内部字符串[]GetCellsStringaray(Microsoft.Office.Interop.Excel.Range)
{
var myvalues=(System.Array)range.Cells.Value;
返回此.converttostringaray(myvalues);
}
内部字符串[]ConvertToString数组(System.Array值)
{
字符串[]数组=新字符串[values.Length];
对于(int i=1;i 26)
{
返回string.Format(“{0}{1}”,(char)(Convert.ToInt32((columnNumber-1)/26)+64),(char)((columnNumber-1)%26)+65));
}
其他的
{
返回string.Format(“{0}”,(char)(columnNumber+64));
}
}
}
}

您好,我刚刚创建了这段代码,它从第一列开始遍历所有行。您可以随意更改它(最新的Microsoft Lib interop 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());
        }
int-sheetIndex=1//请注意,此库使用非零索引
string excelFilePath=“your\u path/your\u excel\u file.xls”;
List yourList=新列表();
Microsoft.Office.Interop.Excel.Application excelApp=新的Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook工作簿=excelApp.Workbooks.Open(excelFilePath);
Microsoft.Office.Interop.Excel.Worksheet工作表=(Microsoft.Office.Interop.Excel.Worksheet)工作簿。工作表[sheetIndex];
Microsoft.Office.Interop.Excel.Range rangeSelection=工作表。列[1];
foreach(rangeSelection.Rows中的Microsoft.Office.Interop.Excel.Range行)
{
Microsoft.Office.Interop.Excel.Range单元格=(Microsoft.Office.Interop.Excel.Range)行.Cells[1,1];
如果(cell.Value2!=null)
list.Add(cell.Value2.ToString());
}

我不知道单元格是否为“X”。我只知道“数字”保存在“W”单元格中。我可能有4个块,我的意思是(4*4*4)你能举个excel的例子吗,哪个是理想的结果?然后是4列,而不是4行。好啊
        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());
        }