2013-05-31 5 views
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;; 
      } 
+0

Предлагаю установить точки прерывания каждый раз, когда вы устанавливаете значения. Пройдите код и посмотрите, как вызываются ваши sets.Add (valueSet). –

+0

Я несколько раз перешагивал код, но до сих пор не вижу, как изменять мои значения. Если вы забыли вторую секунду все мои объекты, и я попросил вас сделать это с помощью «Список <Список >« Как бы вы это сделали? @RezaShirazian –

+0

Ваш код немного трудно читать, вы делаете datatable, затем словарь, помещаете значения в словарь, затем передаете словарь в объект 'valueet', а затем добавляете' valuesets' в список. В целом я бы предложил вернуться и снова выполнить все это с нуля, разбить проблему на более мелкие шаги и не усложнять ее. Начните с малого, добавьте только один столбец через каждую итерацию. По мере того как вы получаете мелкие кусочки, опирайтесь на них. Также не бойтесь использовать 'Debug.WriteLine()', чтобы отслеживать, как работает ваш код. –

ответ

0

попробуйте изменить

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

в

valueset = new ValueSet(values); 
sets.Add(valueset); 
+0

К сожалению, это была только опечатка. Теперь я редактировал код. –

1

Я получил странные результаты с некоторыми файлами с помощью OleDbConnection.

Я предлагаю http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic-Parser-for-Flat-F

При этом вы можете читать CSV в DataTable и разобрать его в списке следующим образом:

DataTable dtPrereg; 

using (GenericParserAdapter gp = new GenericParserAdapter(Server.MapPath("prereg.csv"), Encoding.UTF8)) 
{ 
    gp.FirstRowHasHeader = true; 
    dtPrereg = gp.GetDataTable(); 
} 

Я не проверял это на вкладке разделителями файлов, но это должен работать одинаково (или вы можете преобразовать свой файл в CSV)

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

} 
Смежные вопросы