在C#中使用Linq从特定的excel行开始读取数据

Sac*_*chu 5 c# linq asp.net-mvc

在我的项目中,我需要阅读excel表数据并验证相同的内容.然后将其存储在数据库中.它工作正常,在这个excel模板中row 1是标题和数据将从中开始row 2.

例如:-

Name      Age     Arabic Name   Category
Jack      30             ???     A

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec;
Run Code Online (Sandbox Code Playgroud)

然后我可以使用详细信息 memRec["Age"],memRec["Name"] etc.

这工作正常.

现在,客户端有一个不同的模板,其中前3-4行与其徽标和所有徽标合并.标题将在row 4,数据将从中开始row 5.

例如:

row1
row2
row3
row4    Name     Age    Arabic Name    Category
row5    Jack     30           ????     A
Run Code Online (Sandbox Code Playgroud)

我尝试下面的代码来阅读这个

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec;
Run Code Online (Sandbox Code Playgroud)

它没有读取它并给出错误,因为标题仅从第4行开始.

我不知道数据的范围,因为它取决于用户填充数据.

所以我无法指定工作表范围.

有没有办法指定通过Linq读取excel的起始行.一旦完成,我们可以将行指定为

memRec["Age"],memRec["Name"] etc.?
Run Code Online (Sandbox Code Playgroud)

编辑

我使用下面的代码

 mem = from memRec in excelFile.Worksheet("Addition Form").Skip(2)  select memRec;
Run Code Online (Sandbox Code Playgroud)

但是,当我试图打电话时,memRec["Age"]它给出了错误说no such column and columns available are Logo1,namecomp...etc ..这是excel表第一行的内容

我的excel表现在是这样的

row1     Logo1     namecomp      place        situation
row2     Name      Age           ArabicName   Category
row3     John      30               ???       A
Run Code Online (Sandbox Code Playgroud)

我不希望row1作为我的列标题.列标题位于第2行,数据从第3行开始.

现在,当我尝试读取memrec ["Name"]时,它给出的错误是没有这样的列标题.可用的列标题是Logo1,namecomp等.

请帮我解决这个问题..

小智 2

我不是 Linq 专家,但我认为如果数据不一致,Linq 就不会工作。

您可能想研究使用Ole Db Provider,如这篇文章中所示:

通过 OleDb 使用 Microsoft Access 数据库引擎将 DataTable 插入 Excel

您需要使用以下格式的连接字符串:

    private const string EXCEL_CON =
      @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" +
      @"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
Run Code Online (Sandbox Code Playgroud)

使用它,您可以将数据从 Excel 文件提取到 DataTable:

    public DataTable ExcelToDataTable(string fullFilename, string tableName)
    {
        var table = new DataTable();
        string strCon = string.Format(EXCEL_CON, fullFilename);
        using (var con = new System.Data.OleDb.OleDbConnection(strCon))
        {
            ConnectionState initialState = con.State;
            try
            {
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    con.Open();
                }
                string sql = string.Format("SELECT * FROM `{0}`;", tableName);
                using (var cmd = new System.Data.OleDb.OleDbCommand(sql, con))
                {
                    table.Load(cmd.ExecuteReader());
                }
            }
            finally
            { // it seems like Access does not always close the connection
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }
        return table;
    }
Run Code Online (Sandbox Code Playgroud)

在上面,tableName是您访问数据所需的 Excel 工作表的名称。

您可能正在使用excelFile变量执行类似于现在的操作。我不知道那是什么。

将数据放入 DataTable 对象后,您可以使用基本的for 循环简单地循环数据,如下所示:

    public DataTable CustomTable(DataTable excelTable)
    {
        var table = new DataTable();
        var col0 = table.Columns.Add("Name", typeof(String));
        var col1 = table.Columns.Add("Age", typeof(int));
        var col2 = table.Columns.Add("Arabic Name", typeof(String));
        var col3 = table.Columns.Add("Category", typeof(String));
        var ok = false;
        for (var index = 0; index < excelTable.Rows.Count; index++)
        {
            DataRow excelRow = excelTable.Rows[index];
            if (ok)
            {
                DataRow row = table.NewRow();
                row[col0] = String.Format("{0}", excelRow["Name"]);
                row[col1] = Convert.ToInt32(excelRow["Age"]);
                row[col2] = String.Format("{0}", excelRow["Arabic Name"]);
                row[col3] = String.Format("{0}", excelRow["Category"]);
                table.Rows.Add(row);
            }
            else
            {
                ok = (excelRow[0].ToString() == "Name");
            }
        }
        return table;
    }
Run Code Online (Sandbox Code Playgroud)

我不知道这是否能让你到达你想要的地方,但我希望它至少有帮助。