gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:38:10 26 4
gpt4 key购买 nike

在我的项目中,我需要读取 Excel 工作表数据并对其进行验证。然后存入数据库。它工作正常,在此 Excel 模板中,第 1 行 是标题,数据将从 第 2 行 开始。

例如:-

Name      Age     Arabic Name   Category
Jack 30 بيب A

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec;

然后我可以使用 memRec["Age"],memRec["Name"] 等获取详细信息

这工作正常。

现在客户有一个不同的模板,其中前 3-4 行与他们的 Logo 和所有内容合并。 header 位于 第 4 行,数据将从第 5 行 开始。

例如:

row1
row2
row3
row4 Name Age Arabic Name Category
row5 Jack 30 بسيب A

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

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec;

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

I don't know the range of data also because it depends on user filling data.

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

有什么方法可以指定起始行以通过Linq读取excel。同样,一旦完成,我们可以将行指定为

memRec["Age"],memRec["Name"] etc.?

已编辑

我使用了下面的代码

 mem = from memRec in excelFile.Worksheet("Addition Form").Skip(2)  select memRec;

但是当我尝试调用 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

我不想将第 1 行作为我的列标题。列标题位于第 2 行,数据从第 3 行开始。

Now when I try to read memrec["Name"] it is giving error saying that no such column header. Available column headers are Logo1, namecomp etc..

请帮我解决这个问题..

最佳答案

我不是 Linq 专家,但我认为如果数据不一致,Linq 将无法工作。

您可能想研究使用 Ole Db Provider就像在这篇文章中:

Insert DataTable into Excel Using Microsoft Access Database Engine via OleDb

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

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

使用它,您可以将数据从 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;
}

上面,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;
}

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

关于c# - 在 C# 中使用 Linq 开始从 excel 的特定行读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30859301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com