C# 通过反思向课堂朗读Excel

C# 通过反思向课堂朗读Excel,c#,.net,excel,C#,.net,Excel,我似乎找不到类似的东西,但如果我错过了,请链接 我正在尝试从Excel电子表格(xlsx)导入大量数据。对于每一行,我想创建一个列表(MyClass),其中MyClass有一对键/值属性。对于每一列,我想用Name=[column Name],Value=[column Value]填充MyClass 我开始使用OLEDB将电子表格中的数据提取到DataTable中,但我不确定这是否是最好的读取器。电子表格可能有50000行以上,所以我需要考虑速度/性能。 到目前为止,这就是我所拥有的一切,我无

我似乎找不到类似的东西,但如果我错过了,请链接

我正在尝试从Excel电子表格(xlsx)导入大量数据。对于每一行,我想创建一个列表(MyClass),其中MyClass有一对键/值属性。对于每一列,我想用Name=[column Name],Value=[column Value]填充MyClass

我开始使用OLEDB将电子表格中的数据提取到DataTable中,但我不确定这是否是最好的读取器。电子表格可能有50000行以上,所以我需要考虑速度/性能。

到目前为止,这就是我所拥有的一切,我无法思考如何用列数据填充MyClass

var fileName = string.Format("C:/HAM.xlsx");
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "hardcatAssets");

var data = ds.Tables["hardcatAssets"].AsEnumerable();

foreach(var row in data)
{
    List<MyClass> assets = new List<MyClass>();
    // Do I need another foreach on row.columns?, and then add to assets.
}
Excel表格

Columns: "Asset Code", "Barcode", "Description", "RFID Tag"

我已经更新了我原来的问题,因为我改变了对我想要存储每一行的对象结构的看法。我将把我在下面所做的作为答案发布。

这是我在下面的答案,它允许我将电子表格的每一行捕获到一个对象中,该对象的属性与电子表格列同名(减去单词之间的空格)

List assets=newlist();
var fileName=string.Format(“C:\\HAM.xlsx”);
var connectionString=string.Format(“Provider=Microsoft.ACE.OLEDB.12.0;数据源={0};扩展属性=excel12.0;”,文件名);
var adapter=新的OleDbDataAdapter(“从[Sheet1$]中选择*”,connectionString);
var ds=新数据集();
适配器填充(ds,“硬卡塔组件”);
DataTable data=ds.Tables[“硬目录”];
foreach(data.Rows中的DataRow行)
{
MyClass资产=新的MyClass();
foreach(asset.GetType().GetProperties()中的PropertyInfo pinfo)
{
SetValue(资产,行.字段(this.SplitCamelCase(pinfo.Name));
}
资产。添加(资产);
}
归还资产;

我需要添加用于反射的SplitCamelCase,以便将类属性名称与电子表格列名相匹配。这种方法本质上是在大小写单词之间添加空格。这是在。

当有人谈论自动序列化excel电子表格时,我的脑海中响起了警钟。电子表格是由人填写的吗?有什么保障措施可以保证你所期望的栏目就是即将出现的栏目?如果不是人类填写的,为什么要在allHi Gus使用excel,我也很感谢您的关注。然而幸运的是,该电子表格是从HardCat资产管理数据库中提取的,因此列不会改变。这是我的客户提供的唯一形式的数据。最终,HardCat将被我正在导入数据的系统(目前通过web服务)所取代。好的,如果这是您所能得到的,您可以使用它。你看到了吗?这里接受的答案给出了一些很好的建议,例如我开始使用epplus.codeplex.com来使用Excel。这对于阅读来说要好得多,因为您最终不会看到文件中使用OLEDB reader所做的任何格式表。他们在使电子表格更加面向对象友好方面也做得非常好。把它看一看作为另一种选择。嗨,Krillgar,看起来很有趣,谢谢。我已经设法得到了我想要的结果,因为时间紧迫,但我会考虑这个项目的下一个部分。
Columns: "Asset Code", "Barcode", "Description", "RFID Tag"
List<MyClass> assets = new List<MyClass>();
var fileName = string.Format("C:\\HAM.xlsx");
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "hardcatAssets");
DataTable data = ds.Tables["hardcatAssets"];

foreach (DataRow row in data.Rows)
{
    MyClass asset = new MyClass();

    foreach(PropertyInfo pinfo in asset.GetType().GetProperties())
    {
        pinfo.SetValue(asset, row.Field<string>(this.SplitCamelCase(pinfo.Name)));
    }

    assets.Add(asset);
}

return assets;