2016-08-05 5 views
0

지금까지 스프레드 시트에서 쉽게 데이터를 가져올 수 있습니다. 단지 참조 번호 행을 가져 오는 것이지만 현재 정확한 데이터를 가져 오기 전에 행을 데이터 섹션과 일치시키는 방법을 알지 못합니다.EPPlus를 사용하여 날짜를 행과 비교 한 다음 최종 열 값을 얻는 방법은 무엇입니까?

나는 현재 아래의 엑셀 스프레드 시트 예에서 일부 데이터를 추출 할 수 있습니다

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은 모두 문자열로 읽습니다.

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

표에 올바른 유형이되면 쿼리가 간단하다 : 그것은 DateTime에 첫 번째 열 및 DateTime.Parse 또는 DateTime.ParseExactint.Parseint 두 번째 구문 분석 있도록 수정할 수

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로 필요한 경우