如何将date与行匹配,然后使用EPPlus获取最终的列值?

到目前为止,我可以从电子表格中轻松获取数据,只是获取参考号码行,但是我目前不知道如何在获取正确的数据之前将行匹配到数据部分。

我目前不得不从下面的Excel电子表格中提取一些数据:

Start date Ref number 29/07/2015 2342326 01/07/2016 5697455 02/08/2016 3453787 02/08/2016 5345355 02/08/2015 8364456 03/08/2016 1479789 04/07/2015 9334578 

主要的问题是,是否可以从设定的date读取数据,从行中获取参考号码,例如开始date。

例如,如果我只是想从date设置的数据上个月1日以上。

这将如何最好地实施。

使用基本的OleDb获取列的当前代码示例:

 using System; using System.Data.OleDb; using System.Text.RegularExpressions; namespace Number_Cleaner { public class NumberCleanerReport { public void runExcel_Report() { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("[*][START OF: NumberExt.xls, Number Extraction]"); Console.ResetColor(); string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NumberExt.xls;" + @"Extended Properties='Excel 8.0;HDR=Yes;'"; string connectionString = ExcelWriter.GetConnectionString(); using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; using (OleDbConnection connection = new OleDbConnection(con)) { connection.Open(); OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); System.IO.StreamWriter files = new System.IO.StreamWriter(Controller.fpath + "NumberExtOutput.txt"); using (OleDbDataReader dr = command.ExecuteReader()) { while (dr.Read()) { var row1Col0 = dr[0]; string ExcelData = row1Col0.ToString(); string subStr = "null"; try { subStr = ExcelData.Substring(0, 6); } catch { //Console.WriteLine("Found Nulls."); } if (subStr == "00") { string result = Regex.Replace(ExcelData, "^00", "0"); Console.WriteLine(result); files.WriteLine(result); cmd.CommandText = "INSERT INTO [table1]('MainNmbers') VALUES(" + result + ");"; cmd.ExecuteNonQuery(); } } files.Close(); conn.Close(); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("[*][END OF: NumberExt.xls, RefNumber Extraction]"); Console.ResetColor(); } } } } } } 

您可以将其加载到DataTable ,然后使用Linq-To-DataTable对其进行过滤。 这是一个将全部读取为string的方法。 您可以修改它,以便将第一列parsing为DateTime ,将第二列parsing为DateTime.ParseDateTime.ParseExactint.Parse int

 public static DataTable GetDataTableFromExcel(string path, bool hasHeader = true) { using (var pck = new OfficeOpenXml.ExcelPackage()) { using (var stream = File.OpenRead(path)) { pck.Load(stream); } var ws = pck.Workbook.Worksheets.First(); DataTable tbl = new DataTable(); foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) { tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); } var startRow = hasHeader ? 2 : 1; for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) { var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; DataRow row = tbl.Rows.Add(); foreach (var cell in wsRow) { row[cell.Start.Column - 1] = cell.Text; } } return tbl; } } 

一旦你在表格中有正确的types,查询很简单:

 var rowsOfInterest = table.AsEnumerable() .Where(row => row.Field<DateTime>("Start date") >= new DateTime(2016, 7, 1)) .ToList(); 

如果你需要它作为一个DataTable

 DataTable resultTable = table.Clone(); // empty table with correct columns if(rowsOfInterest.Count > 0) resultTable = rowsOfInterest.CopyToDataTable();