打开 Excel,解析数据?
Open Excel, Parse Data?
(备用标题:Excel 的 ReadAllLines 模拟?:加载和操作 Excel 数据的最佳方式是什么?)
我想快速破解 excel sheet 并执行文本操作。我希望该操作像 ReadAllLines (https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx) 一样工作,但对于 Excel.
我发现以下问题很重要,但已有 7 年历史了。 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"),
});
使用 'External table is not in the expected format.'
的 Fill 方法失败
今天优秀的程序员都这样做吗?即,我应该调查 Jet 并查看是否有最新的更新 Excel,或者是否有新的改进方法?
我根据 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;
}
快如闪电;我不能说我没有使用 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();
(备用标题:Excel 的 ReadAllLines 模拟?:加载和操作 Excel 数据的最佳方式是什么?)
我想快速破解 excel sheet 并执行文本操作。我希望该操作像 ReadAllLines (https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx) 一样工作,但对于 Excel.
我发现以下问题很重要,但已有 7 年历史了。 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"),
});
使用 'External table is not in the expected format.'
的 Fill 方法失败今天优秀的程序员都这样做吗?即,我应该调查 Jet 并查看是否有最新的更新 Excel,或者是否有新的改进方法?
我根据 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;
}
快如闪电;我不能说我没有使用 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();