快速概述:主要目标是从行中的设置日期读取数据,并从设置日期获取参考编号,例如,开始日期。从日期范围的EPPlus输出中剥离数据
例如,如果我只是想从设置的日期的数据到上个月和第一个月以上。
我现在有提取从下面的Excel电子表格示例的一些数据:使用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
输出:
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?
对不起,回复迟了。给出的信息非常丰富,但我确实有一个问题,那就是“worksheet.ConvertSheetToDataTable(ref datatable)”;行我得到以下错误: – Mattlinux1
错误'OfficeOpenXml.ExcelWorksheet'不包含'ConvertSheetToDataTable'的定义,并且没有扩展方法'ConvertSheetToDataTable'接受类型'OfficeOpenXml.ExcelWorksheet'的第一个参数可以找到(是你缺少使用指令或程序集引用? – Mattlinux1
已将行更改为ConvertSheetToDataTable(工作表,ref datatable); – Mattlinux1