我正在使用VS 2010和C#作为Windows窗体应用程序。
我需要将Excel表格中的数据加载到DataSet上。我使用DataSet设计器创建了DataSet,并手动添加了表和列(FirstTable, Column1, Column2)
。由于我经常访问列,因此使用类型化数据集而不是使用无类型数据集会更加清晰。
当我使用OleDBDataAdapter并使用Fill on FirstTable
填充DataTable时,Column1
和Column2
为空,并且还有两个来自Excel工作表的其他列{{1} }。因此,除非我将相同的Excel列名称提供给(ExcelCol1, ExcelCol2)
(如果我将其称为FirstTable
和Column1
,而不是Column2
和ExcelCol1
),则不会填充我通过设计器创建的DataColumns。
有没有办法告诉DataSet忽略来自Excel的列,只填充已定义的DataColumns?
如果不可能,我可以通过DataConnection以某种方式连接Excel工作表来创建DataTables的布局吗?我唯一不确定的是excel文件是用户定义的,因此用户浏览excel文件以填充DataSet。但是所有这些excel文件的列将始终相同。因此,我想使用Typed DataSet预设布局。
答案 0 :(得分:1)
好的,我想我知道该怎么做。我不确定这是否是最干净的方法,因为我仍然需要手工编写它来分配列名称,即没有简单的方法来忽略Excel列名,但至少我能够使用类型化的数据集
This link描述了表和列映射,基本上是您希望使用自己的列名而不是Excel中的列名。
我想指出一些事情,所以我给出了以下代码。
我们假设created a DataSet via the DataSet designer名为MyDataSet.xsd
。它有一个名为FirstTable
的表,其中包含Column1
列和Column2
列。然后,以下代码可用于表映射
MyDataSet myDS = new MyDataset();
//Some query commands using OleDB to get data from Excel
OleDbDataAdapter myAdapter = new OleDbDataAdapter(<OleDbCommand>);
DataTableMapping tableMap = myAdapter.TableMappings.Add("Table", myDS.FirstTable.TableName);
tableMap.ColumnMappings.Add("ExcelCol1", myDS.FirstTable.Column1.ColumnName);
tableMap.ColumnMappings.Add("ExcelCol2", myDS.FirstTable.Column2.ColumnName);
myAdapter.Fill(myDS);
"Table"
,即使我的工作表名称/表名在Excel文件中不同。要利用类型化数据集,您可以使用myDS.FirstTable.TableName
等命令,而不是列名称,而不是
DataTableMapping tableMap = myAdapter.TableMappings.Add(“Table”,“FirstTable”);
因此,如果您更改DataSet中的表名或列名,则可以使用VS的重构实用程序。
我希望这会有所帮助。如果有一个更清洁的解决方案,我将不胜感激任何帮助,但现在这解决了我的问题。