C# 在C中读取Excel 2010文件-单元格

C# 在C中读取Excel 2010文件-单元格,c#,excel,excel-2010,C#,Excel,Excel 2010,更新2 如何从单元格中读取数据并将其存储在数组/字符串中。我已经完成了阅读工作表,但找不到比这更好的了 这是我的excel表格,看起来像: 我应该能够通过我的测试案例1或测试案例2中的列。。。并阅读特定行的列….我建议您查看。它使在.NET中查询Excel变得非常容易 var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Workbook.xlsx"); var current_test_case = "Test_case_1

更新2

如何从单元格中读取数据并将其存储在数组/字符串中。我已经完成了阅读工作表,但找不到比这更好的了

这是我的excel表格,看起来像:


我应该能够通过我的测试案例1或测试案例2中的列。。。并阅读特定行的列….

我建议您查看。它使在.NET中查询Excel变得非常容易

var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Workbook.xlsx");

var current_test_case = "Test_case_1";

var query =
    from row in book.Worksheet("Sheet1")
    let columns = row["columns"].Cast<string>()
    where columns == current_test_case
    select new
    {
        id = row["id"].Cast<int>(),
        name = row["name"].Cast<string>(),
        caption = row["caption"].Cast<string>(),
        date = row["date"].Cast<DateTime>(),
        success = row["success"].Cast<bool>(),
    };

您好,Abu Hamzah作为您的必填只读列,此处的代码是用于读取excel数据的控制台应用程序

class Program
{
    internal static ILog logger = LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();
        string firstName, lastName, dob, lexisNexisID;
        string filePath = @"yor directory path\your file name";

        ExcelProvider provider = ExcelProvider.Create(filePath, "Sheet1");
        foreach (ExcelRow row in (from x in provider select x))
        {
            Console.WriteLine("{0}", row.GetString(1));
            /* the row.Getstring(index) the index is for your column you mey select morcolume as Console.WriteLine("{0}/t{1}", row.GetString(0),row.Getstring(1)); */
        }

    }

}

public class ExcelRow
{
    List<object> columns;

    public ExcelRow()
    {
        columns = new List<object>();
    }

    internal void AddColumn(object value)
    {
        columns.Add(value);
    }

    public object this[int index]
    {
        get { return columns[index]; }
    }

    public string GetString(int index)
    {
        if (columns[index] is DBNull)
        {
            return null;
        }
        return columns[index].ToString();
    }

    public int Count
    {
        get { return this.columns.Count; }
    }
}

public class ExcelProvider : IEnumerable<ExcelRow>
{
    private string sheet;
    private string filePath;
    private List<ExcelRow> rows;


    public ExcelProvider()
    {
        rows = new List<ExcelRow>();
    }

    public static ExcelProvider Create(string filePath, string sheet)
    {
        ExcelProvider provider = new ExcelProvider();
        provider.sheet = sheet;
        provider.filePath = filePath;
        return provider;
    }

    private void Load()
    {
        string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=    ""Excel 12.0;HDR=YES;""";
        connectionString = string.Format(connectionString, filePath);
        rows.Clear();
        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
            }
            using (OleDbCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "select * from [" + sheet + "$]";
                using (OleDbDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        ExcelRow newRow = new ExcelRow();
                        for (int count = 0; count < reader.FieldCount; count++)
                        {
                            newRow.AddColumn(reader[count]);
                        }
                        rows.Add(newRow);
                    }
                }
            }
        }
    }

    public IEnumerator<ExcelRow> GetEnumerator()
    {
        Load();
        return rows.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        Load();
        return rows.GetEnumerator();
    }

}
关于过滤

当您使用OleDb进行数据检索时,没有什么可以阻止您使用更高级的SQL:

string testCaseName = "Test_case_1
string query = String.Format("SELECT * from [{0}$] WHERE columns=\"{1}\"", workbookName, testCaseName);
可以使用列的名称进行筛选。在您的情况下,过滤器位于columns字段上。顺便说一句,这是一个令人困惑的名字


据我所知,表格的标题必须在第一行,您可能需要将表格上移一行。

嘿,感谢LinqToExcel提醒。。。。也许我在我的问题中没有很好地解释你们,所以让我重申一下。。。我正在构建一个测试用例,所以我将从excel工作表中读取数据,而不是整个工作表,一次只读取一行。例如:如果我正在处理测试用例1,我应该能够只读取属于测试用例1的行。。根据你上面的代码。看起来它将读取整个excel工作表。。不是吗?@AbuHamzah-你当然可以过滤数据。我已经编辑了我的代码来演示如何。虽然它很快,所以阅读它应该不会有太大的问题。所以我必须使用第三方dllhmmmm@AbuHamzah-尽可能简化编码和维护代码的工作…:-是的,我同意它令人困惑的名字,我应该用TestCaseName来命名,而不是column。我已经更改了代码,添加了引号-我相信它们是必要的,我错过了它们。看起来它工作正常,但它打乱了顺序,所以如果我正在阅读test_case_2的专栏,那么我将得到test_case_1的单元格值
class Program
{
    internal static ILog logger = LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();
        string firstName, lastName, dob, lexisNexisID;
        string filePath = @"yor directory path\your file name";

        ExcelProvider provider = ExcelProvider.Create(filePath, "Sheet1");
        foreach (ExcelRow row in (from x in provider select x))
        {
            Console.WriteLine("{0}", row.GetString(1));
            /* the row.Getstring(index) the index is for your column you mey select morcolume as Console.WriteLine("{0}/t{1}", row.GetString(0),row.Getstring(1)); */
        }

    }

}

public class ExcelRow
{
    List<object> columns;

    public ExcelRow()
    {
        columns = new List<object>();
    }

    internal void AddColumn(object value)
    {
        columns.Add(value);
    }

    public object this[int index]
    {
        get { return columns[index]; }
    }

    public string GetString(int index)
    {
        if (columns[index] is DBNull)
        {
            return null;
        }
        return columns[index].ToString();
    }

    public int Count
    {
        get { return this.columns.Count; }
    }
}

public class ExcelProvider : IEnumerable<ExcelRow>
{
    private string sheet;
    private string filePath;
    private List<ExcelRow> rows;


    public ExcelProvider()
    {
        rows = new List<ExcelRow>();
    }

    public static ExcelProvider Create(string filePath, string sheet)
    {
        ExcelProvider provider = new ExcelProvider();
        provider.sheet = sheet;
        provider.filePath = filePath;
        return provider;
    }

    private void Load()
    {
        string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=    ""Excel 12.0;HDR=YES;""";
        connectionString = string.Format(connectionString, filePath);
        rows.Clear();
        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
            }
            using (OleDbCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "select * from [" + sheet + "$]";
                using (OleDbDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        ExcelRow newRow = new ExcelRow();
                        for (int count = 0; count < reader.FieldCount; count++)
                        {
                            newRow.AddColumn(reader[count]);
                        }
                        rows.Add(newRow);
                    }
                }
            }
        }
    }

    public IEnumerator<ExcelRow> GetEnumerator()
    {
        Load();
        return rows.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        Load();
        return rows.GetEnumerator();
    }

}
string testCaseName = "Test_case_1
string query = String.Format("SELECT * from [{0}$] WHERE columns=\"{1}\"", workbookName, testCaseName);