2015-03-03 54 views
-1

(替代标题:ReadAllLines Analogue for Excel ?:什么是加载和操作Excel数据的最佳方式?)打开Excel,解析数据?

我想快速破解一个Excel表单并执行文本操作。我希望操作像ReadAllLines(https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx)一样工作,但对于Excel。

我发现以下问题,这是关于点,但七岁。 (此外,这是一个有历史意义的问题被冻结,而且,我没有50分,所以我不能评论它是否公开)。我将Robin Robinson的答案剪切并粘贴到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方法上失败,'External table is not in the expected format。'

好的程序员今天就这样做了吗?即,我应该调查Jet并查看最新的Excel是否有更新,或者是否有新的改进方法?

+0

你没有给出任何迹象表明除了“似乎没有工作”以外发生了什么。它可能会工作,但你的配置失败是完全可能的。与其问一个新的模糊的问题,你最好在现有答案中添加评论。我知道你还没有足够的代表评论 - 但这并不意味着提出一个糟糕的问题是前进的正确方向。 – 2015-03-03 11:34:18

+0

谢谢 - 但我不想找你纠正这个问题。我问是否近7年后推荐这种相同的做法。如果是,那么我会担心它为什么不起作用。我会通过这些评论来改进问题。 – jacoblambert 2015-03-03 11:49:34

+0

我认为这不太可能会真正成为一个好的话题性问题。 – 2015-03-03 11:53:53

回答

0

这是减轻快。我不能告诉我没有做文字与操作ReadAllLines和正则表达式(删除了文本操作细节)。

我怎么它得到工作的意见,原来的问题进行了说明。

不知道为什么它是如此的速度远远超过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

我拼凑起来的基于乔恩斯基特的建议,使用互操作的原型,并在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; 
}