2016-08-05 92 views
0

Bisher kann ich einen einfachen Datenzugriff aus der Tabelle ausführen, indem ich nur die RefNummer-Zeile abrufe, aber ich weiß derzeit nicht, wie ich die Zeile mit dem Datenabschnitt abgleichen soll, bevor die richtigen Daten ausgegeben werden.Wie wird das Datum mit der Zeile verglichen, dann wird der letzte Spaltenwert mit EPPlus abgerufen?

Ich muss noch einige Daten aus dem Beispiel Excel-Tabelle extrahieren unten:

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 

Die wichtigste Frage ist, wäre es möglich, die Daten aus einem bestimmten Datum zu lesen, aus der Reihe und erhalten den Referee Nummer aus dem eingestellten Datum z Anfangsdatum.

Zum Beispiel wenn ich wollte nur die Daten von dem Datum auf den 1. des letzten Monats und höher eingestellt.

Wie würde dies am besten umgesetzt werden.

Beispiel aktuellen Code verwendet, um die Säule zu erhalten, grundlegende OleDb mit:

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

Antwort

1

Sie es in ein DataTable laden konnten und es dann mit Linq-To-DataTable filtern. Here's a method, die alle als Zeichenfolgen liest. Man könnte es so ändern, dass es die erste Spalte zu DateTime und die zweite zu int mit DateTime.Parse oder DateTime.ParseExact und int.Parse analysieren:

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

Sobald Sie die richtigen Typen in der Tabelle haben die Abfrage ist einfach:

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

Wenn Sie es als DataTable brauchen:

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