C# 从Excel文件中读取
我见过很多这样的例子,但有些东西对我不起作用 我想做的是阅读Excel表格,给定一张表格,并将这些值存储到列表中 例如,假设我有一个excel文件,该文件如下所示:C# 从Excel文件中读取,c#,database,oledb,C#,Database,Oledb,我见过很多这样的例子,但有些东西对我不起作用 我想做的是阅读Excel表格,给定一张表格,并将这些值存储到列表中 例如,假设我有一个excel文件,该文件如下所示: First Second Third f1 s1 t1 f2 s2 t2 f3 s3 t3 每行被视为一组值 这就是我目前所做的: List<string> ColumnNames= GetColumnNames(); using (O
First Second Third
f1 s1 t1
f2 s2 t2
f3 s3 t3
每行被视为一组值
这就是我目前所做的:
List<string> ColumnNames= GetColumnNames();
using (OleDbConnection OleDbConn = new OleDbConnection(Path))
{
OleDbConn.Open();
String cmdString = "SELECT * FROM [" + sheetName+ "]";
OleDbCommand cmd = new OleDbCommand(cmdString, OleDbConn);
DataTable dt = new DataTable();
List<ValueSet> sets = new List<ValueSet>();
Dictionary<string, Value> values = new Dictionary <string,value>()
ValueSet valueset = new ValueSet(null);
using (OleDbDataReader oleRdr = cmd.ExecuteReader())
{
while (oleRdr.Read())
{
for (int i = 0; i < ColumnNames.Count; i++)
{
ColumnName cn = new ColumnName(columnNames[i]);
string data= oleRdr[f.Name].ToString();
Value value = new Value(data, f);
if (!values.ContainsKey(ColumnNames[i]))
{
values.Add(ColumnNames[i], value);
}
else
{
values[ColumnNames[i]] = value;
}
}
valueSet= new ValueSet(values);
sets.Add(valueSet);
}
return sets;;
}
List ColumnNames=GetColumnNames();
使用(OleDbConnection OleDbConn=新OleDbConnection(路径))
{
OleDbConn.Open();
String cmdString=“从[“+sheetName+”]中选择*”;
OleDbCommand cmd=新的OleDbCommand(cmdString,OleDbConn);
DataTable dt=新的DataTable();
列表集=新列表();
字典值=新字典()
ValueSet ValueSet=新的ValueSet(空);
使用(OleDbDataReader oleRdr=cmd.ExecuteReader())
{
while(oleRdr.Read())
{
for(int i=0;i
尝试更改
ValueSet= new ValueSet(values);
sets.Add(ValueSet);
到
使用
OleDbConnection
,我在某些文件中得到了奇怪的结果
我建议
使用此功能,您可以将CSV读入数据表,并将其解析为列表,如下所示:
DataTable dtPrereg;
using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8))
{
gp.FirstRowHasHeader = true;
dtPrereg = gp.GetDataTable();
}
我还没有在制表符分隔的文件上测试过这一点,但是它应该也能工作(或者你可以将你的文件转换成CSV)如果你真的有一个具有已知数量的命名列的电子表格,并且你想将它们投影到一个
列表中
,那么使用Linq做起来就容易多了
e、 g
列表数据;
使用(OleDbDataReader rdr=cmd.ExecuteReader())
{
数据=(来自rdr.Cast()中的行)
选择新列表
{
行[“第一”].ToString(),
行[“第二”].ToString(),
第[“第三”]行。ToString()
}).ToList();
}
我建议您每次设置值时都要设置断点。逐步完成代码并观察您的设置。添加(valueSet)正在被调用。我已经对代码进行了多次检查,我仍然不知道如何修改我的值。如果你忘记了我的所有对象,我让你用List
执行此操作,你会怎么做?@rezashiraziany你的代码有点难读,你先创建一个数据表,然后创建一个字典,然后将值放入字典中将字典传递给valueset
对象,然后将valueset
添加到列表中。总体而言,我建议返回并从头开始重新做整个事情,将问题分解为更小的步骤,不要使其过于复杂。从小处开始,就像每次迭代只添加一列一样。当你得到小pi时ECE正在工作,请在此基础上构建。也不要害怕使用Debug.WriteLine()
来跟踪代码的运行情况behaving@RezaShirazian这个方法我已经用了一百万次了。我会再试一次,尽可能地分解它。谢谢。
DataTable dtPrereg;
using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8))
{
gp.FirstRowHasHeader = true;
dtPrereg = gp.GetDataTable();
}
List<List<string>> data;
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
data = (from row in rdr.Cast<DbDataRecord>()
select new List<string>
{
row["First"].ToString(),
row["Second"].ToString(),
row["Third"].ToString()
}).ToList();
}