Краткий обзор: Основная цель состоит в том, чтобы считывать данные с установленной даты из строки и получать номер ref из установленной даты, например. Дата начала.Удаление данных с выхода EPPlus с диапазона дат
Например, если мне просто нужны данные с даты, установленной до 1-го числа прошлого месяца и выше.
В настоящее время я должен извлечь некоторые данные из примера таблицы 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
Выход с помощью EPPlus:
29/07/2015
2342326
29/07/2016
5697455
02/08/2016
3453787
02/08/2016
5345355
02/08/2015
8364456
03/08/2016
1479789
04/07/2015
9334578
Эта часть хорошо, но когда я пытаюсь чтобы вырезать вывод через диапазон дат, я получаю ошибки, например используя LINQ, я получаю следующий вывод ошибки.
An unhandled exception of type 'System.InvalidCastException' occurred in System.Data.DataSetExtensions.dll
Additional information: Specified cast is not valid.
LINQ код:
var rowsOfInterest = tbl.AsEnumerable()
.Where(row => row.Field<DateTime>("Start date") >= new DateTime(2016, 7, 1))
.ToList();
Я также попытался модифицировать от диапазона дат, используя DataTable:
DataRow[] result = tbl.Select("'Start date' >= #1/7/2016#");
Но получить следующее сообщение об ошибке:
An unhandled exception of type 'System.Data.EvaluateException' occurred in System.Data.dll
Additional information: Cannot perform '>=' operation on System.String and System.Double.
Последняя попытка состояла в том, чтобы попытаться выяснить, Я могу удалить дату из цикла.
код используется:
DateTime dDate;
row[cell.Start.Column - 1] = cell.Text;
string dt = cell.Text.ToString();
if (DateTime.TryParse(dt, out dDate))
{
DateTime dts = Convert.ToDateTime(dt);
}
DateTime date1 = new DateTime(2016, 7, 1);
if (dDate >= date1)
{
Console.WriteLine(row[cell.Start.Column - 1] = cell.Text);
}
Этот вид работ, но просто перечисляет установленные даты, а не там значения, что вполне понятно, если я принять этот маршрут, как бы я получить с датами, там ценности?
Выход:
29/07/2016
02/08/2016
02/08/2016
03/08/2016
используется Полный пример кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.OleDb;
using System.Text.RegularExpressions;
using Microsoft.Office.Interop.Excel;
using System.Data;
using System.IO;
namespace Number_Cleaner
{
public class NumbersReport
{
//ToDo: Look in to fixing the code so it filters the date correctly with the right output data.
public System.Data.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();
System.Data.DataTable tbl = new System.Data.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)
{
DateTime dDate;
row[cell.Start.Column - 1] = cell.Text;
string dt = cell.Text.ToString();
//Console.WriteLine(dt);
if (DateTime.TryParse(dt, out dDate))
{
DateTime dts = Convert.ToDateTime(dt);
}
DateTime date1 = new DateTime(2016, 7, 1);
if (dDate >= date1)
{
Console.WriteLine(row[cell.Start.Column - 1] = cell.Text);
}
//Console.WriteLine(row[cell.Start.Column - 1] = cell.Text);
}
}
//var rowsOfInterest = tbl.AsEnumerable()
// .Where(row => row.Field<DateTime>("Start date") >= new DateTime(2016, 7, 1))
//.ToList();
//Console.WriteLine(tbl);
//DataRow[] result = tbl.Select("'Start date' >= #1/7/2016#");
return tbl;
}
}
Измененный: How to match date to row then get the final column value using EPPlus?
Извините за поздний ответ. приведенная информация очень информативна, у меня есть одна проблема, хотя и это один из «рабочий лист.ConvertSheetToDataTable (ref datatable)»; line, я получаю следующую ошибку: – Mattlinux1
Ошибка «OfficeOpenXml.ExcelWorksheet» не содержит определения для «ConvertSheetToDataTable» и не используется метод расширения «ConvertSheetToDataTable», принимающий первый аргумент типа «OfficeOpenXml.ExcelWorksheet» (вы можете отсутствует директива using или ссылка на сборку? – Mattlinux1
Изменена строка ConvertSheetToDataTable (рабочий лист, ref datatable); – Mattlinux1