(备用标题:Excel的ReadAllLines模拟?:加载和操作Excel数据的最佳方法是什么?)
我想快速破解Excel工作表并执行文本操作。我希望该操作像ReadAllLines(https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx)一样工作,但对于Excel。
我发现了以下问题,这个问题已经过了七年之久。 Reading Excel files from C#(此外,这是一个历史上重要的问题被冻结。此外,我没有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方法上失败,“外部表格不是预期的格式。”
优秀的程序员今天这样做吗?即,我应该调查Jet并查看是否有最新Excel的更新,还是有新的改进方式?
答案 0 :(得分:0)
我根据Jon Skeet的推荐使用Interop拼凑了一个原型,juliusz在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;
}
答案 1 :(得分: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();