C# 从Excel文件中读取

C# 从Excel文件中读取,c#,database,oledb,C#,Database,Oledb,我见过很多这样的例子,但有些东西对我不起作用 我想做的是阅读Excel表格,给定一张表格,并将这些值存储到列表中 例如,假设我有一个excel文件,该文件如下所示: First Second Third f1 s1 t1 f2 s2 t2 f3 s3 t3 每行被视为一组值 这就是我目前所做的: List<string> ColumnNames= GetColumnNames(); using (O

我见过很多这样的例子,但有些东西对我不起作用

我想做的是阅读Excel表格,给定一张表格,并将这些值存储到列表中

例如,假设我有一个excel文件,该文件如下所示:

First   Second  Third
f1      s1      t1
f2      s2      t2
f3      s3      t3
每行被视为一组值

这就是我目前所做的:

List<string> ColumnNames= GetColumnNames();

        using (OleDbConnection OleDbConn = new OleDbConnection(Path))
        {
            OleDbConn.Open();
            String cmdString = "SELECT * FROM [" + sheetName+ "]";
            OleDbCommand cmd = new OleDbCommand(cmdString, OleDbConn);
            DataTable dt = new DataTable();
            List<ValueSet> sets = new List<ValueSet>();
            Dictionary<string, Value> values = new Dictionary <string,value>()
            ValueSet valueset = new ValueSet(null);
            using (OleDbDataReader oleRdr = cmd.ExecuteReader())
            {
                while (oleRdr.Read())
                {
                    for (int i = 0; i < ColumnNames.Count; i++)
                    {
                        ColumnName cn = new ColumnName(columnNames[i]);

                        string data= oleRdr[f.Name].ToString();
                        Value value = new Value(data, f);

                        if (!values.ContainsKey(ColumnNames[i]))
                        {
                            values.Add(ColumnNames[i], value);
                        }
                        else
                        {
                            values[ColumnNames[i]] = value;
                        }
                    }
                    valueSet= new ValueSet(values);
                    sets.Add(valueSet);
                }
                return sets;;
            }
List ColumnNames=GetColumnNames();
使用(OleDbConnection OleDbConn=新OleDbConnection(路径))
{
OleDbConn.Open();
String cmdString=“从[“+sheetName+”]中选择*”;
OleDbCommand cmd=新的OleDbCommand(cmdString,OleDbConn);
DataTable dt=新的DataTable();
列表集=新列表();
字典值=新字典()
ValueSet ValueSet=新的ValueSet(空);
使用(OleDbDataReader oleRdr=cmd.ExecuteReader())
{
while(oleRdr.Read())
{
for(int i=0;i
尝试更改

 ValueSet= new ValueSet(values);
 sets.Add(ValueSet);


使用
OleDbConnection
,我在某些文件中得到了奇怪的结果

我建议

使用此功能,您可以将CSV读入数据表,并将其解析为列表,如下所示:

DataTable dtPrereg;

using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8))
{
    gp.FirstRowHasHeader = true;
    dtPrereg = gp.GetDataTable();
}

我还没有在制表符分隔的文件上测试过这一点,但是它应该也能工作(或者你可以将你的文件转换成CSV)

如果你真的有一个具有已知数量的命名列的电子表格,并且你想将它们投影到一个
列表中
,那么使用Linq做起来就容易多了

e、 g

列表数据;
使用(OleDbDataReader rdr=cmd.ExecuteReader())
{
数据=(来自rdr.Cast()中的行)
选择新列表
{
行[“第一”].ToString(),
行[“第二”].ToString(),
第[“第三”]行。ToString()
}).ToList();
}

我建议您每次设置值时都要设置断点。逐步完成代码并观察您的设置。添加(valueSet)正在被调用。我已经对代码进行了多次检查,我仍然不知道如何修改我的值。如果你忘记了我的所有对象,我让你用
List
执行此操作,你会怎么做?@rezashiraziany你的代码有点难读,你先创建一个数据表,然后创建一个字典,然后将值放入字典中将字典传递给
valueset
对象,然后将
valueset
添加到列表中。总体而言,我建议返回并从头开始重新做整个事情,将问题分解为更小的步骤,不要使其过于复杂。从小处开始,就像每次迭代只添加一列一样。当你得到小pi时ECE正在工作,请在此基础上构建。也不要害怕使用
Debug.WriteLine()
来跟踪代码的运行情况behaving@RezaShirazian这个方法我已经用了一百万次了。我会再试一次,尽可能地分解它。谢谢。
DataTable dtPrereg;

using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8))
{
    gp.FirstRowHasHeader = true;
    dtPrereg = gp.GetDataTable();
}
List<List<string>> data;

using (OleDbDataReader rdr = cmd.ExecuteReader())
{
    data = (from row in rdr.Cast<DbDataRecord>()
            select new List<string>
            {
                row["First"].ToString(),
                row["Second"].ToString(),
                row["Third"].ToString()
            }).ToList();

}