2016-08-05 5 views
0

До сих пор я могу сделать простой захват данных из электронной таблицы, просто получив номер строки ref, но в настоящее время я не знаю, как сопоставить строку с разделом данных, прежде чем получать правильные данные.Как сопоставить дату для строки, затем получить окончательное значение столбца с помощью 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 

Главный вопрос в том, будет ли возможность читать данные с определенной даты, из строки и получить реф номер из установленной даты, например Дата начала.

Например, если мне просто нужны данные с даты, установленной до 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(); 
       } 
      } 
     } 
    } 
} 
} 

ответ

1

Вы можете загрузить его в DataTable, а затем процеживают с Linq-To-DataTable. Here's a method, который читает все как строки. Вы можете изменить его так, чтобы он разобрать первый столбец DateTime, а второй к int с DateTime.Parse или DateTime.ParseExact и int.Parse:

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; 
    } 
} 

После того, как у вас есть правильные типы в таблице запроса проста:

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();