2015-03-03 4 views
-1

(Альтернативное название: ReadAllLines Analogue for Excel: какой способ загрузки и манипулирования данными Excel?)Открыть Excel, проанализировать данные?

Я хотел бы быстро взломать лист Excel и выполнить текстовые манипуляции. Я хочу, чтобы операция работала как ReadAllLines (https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx), но для Excel.

Я нашел следующий вопрос, который находится на точке, но семь лет. Reading Excel files from C# (Кроме того, это замороженный, исторически важный вопрос. Более того, у меня нет 50 баллов, поэтому я не смог бы прокомментировать, если бы он был открыт.) Я вырезал и вставил ответ Робин Робинсон в Visual Studio, изменив только путь :

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory()); 
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName); 

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString); 
var ds = new DataSet(); 

adapter.Fill(ds, "anyNameHere"); 

var data = ds.Tables["anyNameHere"].AsEnumerable(); 

var query = data.Where(x => x.Field<string>("id") != string.Empty).Select(x => 
      new 
      { 
       id= x.Field<string>("id"), 
      }); 

Это не работает по методу Fill, так как «Внешняя таблица не соответствует ожидаемому формату».

Хорошие ли программисты сегодня делают это сегодня? т. е. следует ли исследовать Jet и посмотреть, есть ли обновления для последнего Excel, или есть новый и улучшенный способ?

+0

Вы не указали, что произошло иначе, чем «похоже, не работает». Вполне возможно, что он * будет * работать, но у вас есть сбой конфигурации. Вместо того, чтобы задавать новый и неопределенный вопрос, вам было бы лучше добавить комментарий к существующему ответу. Я понимаю, что у вас недостаточно комментариев для комментариев, но это не значит, что задавать плохой вопрос - это правильный путь вперед. –

+0

Спасибо, но я не ищу, чтобы вы исправили проблему. Я спрашиваю, рекомендуется ли эта же практика почти семь лет спустя. Если да, то я буду беспокоиться о том, почему это не работает. Я буду работать над уточнением вопроса с помощью этих комментариев. – jacoblambert

+0

Я думаю, что маловероятно, что это действительно выйдет как хороший, по теме вопрос, если честно. –

ответ

0

Это молниеносный;. Я не могу сказать, что я не буду делать текстовые манипуляции с ReadAllLines и Regex. (Убрано подробности работы с текстом).

Как я получил его на работу объясняется в комментариях к первоначальному вопросу.

Не знаю, почему это так намного быстрее, чем кодирование Неэффективное Interop.Excel. ? Более эффективный API?

Любое понимание оценено!

 var path = string.Format(@"C:\Users\jlambert\Desktop\encryptedSSNs.xlsx"); 
     var connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;"; 


     var adapter = new OleDbDataAdapter("SELECT * FROM [sheetName$]", connStr); 
     var ds = new DataSet(); 

     adapter.Fill(ds, "anyNameHere"); 

     var data = ds.Tables["anyNameHere"].AsEnumerable(); 

     var query = data.Where(x => x.Field<string>("MRN") != string.Empty).Select(x => 
      new 
      { 
       mrn = x.Field<string>("MRN"), 
       ssn = x.Field<string>("ssn"), 
      }); 

     foreach (var q in query) 
     { 
      Console.WriteLine(q);  
     } 
     Console.ReadLine(); 
0

я починил прототип, основанный на рекомендации Джона Скита использовать Interop, и ответ на Юлиуш на How do I import from Excel to a DataSet using Microsoft.Office.Interop.Excel?

Однако, есть две вещи, которые я действительно не люблю об этом: Во-первых, это, кажется, у меня есть для ввода всех имен столбцов. Во-вторых, он загружает всю таблицу в памяти, а не чтение как поток (занимает минуту, даже для относительно небольших таблиц

private static void Main(string[] args) 
{ 
    var dataT = Import(@"C:\Users\jlambert\Desktop\dSmall_encrypted.xlsx"); 

    var data = dataT.AsEnumerable(); 
... 
} 
public static System.Data.DataTable Import(String path) 
{ 
    var app = new Application(); 
    Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

    Worksheet workSheet = (Worksheet)workBook.ActiveSheet; 

    int index = 0; 
    object rowIndex = 2; 

    System.Data.DataTable dt = new System.Data.DataTable(); 
    dt.Columns.Add("Facility_code");      
    dt.Columns.Add("MRN"); 
    dt.Columns.Add("first_name"); 
    dt.Columns.Add("middle_name"); 
    dt.Columns.Add("last_name"); 
    dt.Columns.Add("address_line_1"); 
    dt.Columns.Add("address_line_2"); 
    dt.Columns.Add("city"); 
    dt.Columns.Add("state"); 
    dt.Columns.Add("zip"); 
    dt.Columns.Add("date_of_birth"); 
    dt.Columns.Add("gender"); 
    dt.Columns.Add("ssn"); 
    dt.Columns.Add("home_phone"); 
    dt.Columns.Add("work_phone"); 
    dt.Columns.Add("cell_phone"); 
    dt.Columns.Add("PCP"); 
    dt.Columns.Add("Practice Location"); 

    DataRow row; 

    while (((Range)workSheet.Cells[rowIndex, 1]).Value2 != null) 
    { 
     rowIndex = 2 + index; 
     row = dt.NewRow(); 
     row[0] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 1]).Value2); 
     row[1] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 2]).Value2); 
     row[2] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 3]).Value2); 
     row[3] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 4]).Value2); 
     row[4] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 5]).Value2); 
     row[5] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 6]).Value2); 
     row[6] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 7]).Value2); 
     row[7] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 8]).Value2); 
     row[8] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 9]).Value2); 
     row[9] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 10]).Value2); 
     row[10] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 11]).Value2); 
     row[11] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 12]).Value2); 
     row[12] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 13]).Value2); 
     row[13] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 14]).Value2); 
     row[14] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 15]).Value2); 
     row[15] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 16]).Value2); 
     row[16] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 17]).Value2); 
     row[17] = Convert.ToString(((Range)workSheet.Cells[rowIndex, 18]).Value2); 
     index++; 
     dt.Rows.Add(row); 
    } 
    app.Workbooks.Close(); 
    return dt; 
} 
Смежные вопросы