2016-08-05 13 views
0

これまでのところ、スプレッドシートから簡単にデータを取得することはできますが、参照番号の行を取得するだけですが、現在、正しいデータを取得する前に行をデータセクションに一致させる方法がわかりません。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 

主な問題は、行から、設定した日付からデータを読み込むとrefを取得することが可能であるです数字は設定された日付を表します。開始日。

たとえば、私はちょうど前の月の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に最初の列を解析し、DateTime.ParseまたはDateTime.ParseExactint.Parseintに2番目ようにあなたはそれを変更できます。

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 resultTable = table.Clone(); // empty table with correct columns 
if(rowsOfInterest.Count > 0) 
    resultTable = rowsOfInterest.CopyToDataTable(); 
:あなたは DataTableとしてそれを必要とする場合

関連する問題