我见过许多这方面的例子,但有些事情对我不起作用。
我要做的是阅读Excel表格,给出一张表并将这些值存储到列表中。
例如,假设我有一个excel文件,如下所示:
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;;
}
答案 0 :(得分:1)
对于使用OleDbConnection
的某些文件,我得到了奇怪的结果。
我建议http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic-Parser-for-Flat-F
使用此功能,您可以将CSV读入数据表并将其解析为列表,如下所示:
DataTable dtPrereg;
using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8))
{
gp.FirstRowHasHeader = true;
dtPrereg = gp.GetDataTable();
}
我没有在制表符分隔文件上对此进行测试,但它应该工作相同(或者您可以将文件转换为CSV)
答案 1 :(得分:1)
如果你真的有一个包含已知数量的命名列的电子表格,并且你想将它们投射到List<List<string>>
,那么使用Linq就可以轻松实现它。
e.g。
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();
}
答案 2 :(得分:0)
尝试更改
ValueSet= new ValueSet(values);
sets.Add(ValueSet);
到
valueset = new ValueSet(values);
sets.Add(valueset );