1

私はこれの多くの例を見てきましたが、何かがうまくいきません。

私がやろうとしているのは、シートを指定して 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;;
            }
4

3 に答える 3

1

既知の数の名前付き列を含むスプレッドシートが実際にあり、それらを にList<List<string>>射影したい場合は、Linq を使用する方がはるかに簡単です。

例えば

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();

}
于 2013-05-31T21:58:36.570 に答える
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 に変換できます)。

于 2013-05-31T20:38:10.550 に答える
0

変更してみてください

 ValueSet= new ValueSet(values);
 sets.Add(ValueSet);

valueset = new ValueSet(values);
sets.Add(valueset );
于 2013-05-31T18:40:37.623 に答える