在我的项目中,我需要读取 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;
然后我可以使用memRec["Age"],memRec["Name"] etc.
获取详细信息
这工作正常。
现在,客户端有一个不同的模板,其中前 3-4 行与其徽标和所有内容合并。标头将位于row 4
,数据将从row 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 行开始。
我不知道数据的范围,因为它取决于用户填写 数据。
所以我无法指定工作表范围。
有没有办法指定起始行以通过 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.
..等。。这是Excel工作表第一行的内容
我的 Excel 工作表现在是这样的
row1 Logo1 namecomp place situation
row2 Name Age ArabicName Category
row3 John 30 يبي A
我不希望 row1 作为我的列标题。列标题位于第 2 行,数据从第 3 行开始。
现在,当我尝试读取memrec["名称"]时,它给出错误说 没有这样的列标题。可用的列标题是徽标 1、名称组合 等。。
请帮我解决这个问题。
我不是 Linq 专家,但如果数据不一致,我认为 Linq 不会工作。
您可能想研究使用 Ole Db 提供程序,如这篇文章所示:
通过 OleDb 使用 Microsoft Access 数据库引擎将数据表插入到 Excel 中
您需要使用以下格式的连接字符串:
private const string EXCEL_CON =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" +
@"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
使用它,您可以将 Excel 文件中的数据提取到数据表中:
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;
}
我不知道这是否能让你到达你想去的地方,但我希望它至少有所帮助。