2015-11-12 3 views
0

Имейте в виду, что каждый столбец выделяет данные и хранит словарь (или массив) с помощью Excel.interop. Я пробовал следующий код, но он не совпадает с Excel.interop.Получите отличные значения из столбца по столбцу

 var excel = new ExcelQueryFactory("worksheetFileName"); 
     var distinctNames = (from row in excel.WorkSheet() select row["ColB"]).Distinct(); 

Просьба предоставить Excel.Interop snippet/code, чтобы получать значения столбцов по столбцам и хранить в массиве.

ответ

1

Для этой операции нет смысла использовать автоматизацию Excel, вместо этого разумным направлением является работа с OleDb, если нет разумной причины для использования автоматизации Excel.

Пример: фигура 1 - это функция для создания строки соединения, которая может использоваться в любом проекте, в то время как цифра 2 предназначена для чтения данных.

Для работы с автоматизацией Excel мы открываем себя для объектов, которые не удаляются, если есть авария или что вы неправильно кодируете (это я называю правилом двух точек), когда объекты не могут быть освобождены из-за того, как вы создали и использовали объекты автоматизации, которые не встречаются с OleDb. Теперь, если вы хотите форматировать, чем переходите к автоматизации.

public string ConnectionString(string FileName, string Header) 
{ 
    OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder(); 
    if (System.IO.Path.GetExtension(FileName).ToUpper() == ".XLS") 
    { 
     Builder.Provider = "Microsoft.Jet.OLEDB.4.0"; 
     Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=1;HDR={0};", Header)); 
    } 
    else 
    { 
     Builder.Provider = "Microsoft.ACE.OLEDB.12.0"; 
     Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=1;HDR={0};", Header)); 
    } 

    Builder.DataSource = FileName; 

    return Builder.ConnectionString; 
} 

код, чтобы прочитать первый столбец в Лист2 и получить различные значения, в этом случае я работаю против колонки с датами, как строки в список, где файл находится в той же папке, что и приложение исполняемые

private List<string> DemoDistinct() 
{ 
    List<string> dateList = new List<string>(); 
    DataTable dt = new DataTable(); 

    using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(System.IO.Path.Combine(Application.StartupPath, "WS1.xlsx"), "Yes") }) 
    { 
     cn.Open(); 

     using (OleDbCommand cmd = new OleDbCommand 
     { 
      CommandText = "SELECT DISTINCT [Dates] FROM [Sheet2$]", 
      Connection = cn 
     } 
     ) 
     { 
      OleDbDataReader dr = cmd.ExecuteReader(); 
      dt.Load(dr); 
      dateList = dt 
       .AsEnumerable() 
       .Select(row => row.Field<DateTime>("Dates").ToShortDateString()).ToList();      
     } 
    } 

    return dateList; 
} 
+0

Большое вам спасибо за ваш ответ. Я пытаюсь с вашим Кодом. –

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