简体   繁体   English

使用 Linq 从 Excel 工作表中读取

[英]Use Linq To Read From An Excel Sheet

How does one convert the following for loop into linq query to use exampleDataList and get the values out of it?如何将以下 for 循环转换为 linq 查询以使用exampleDataList并从中获取值?

string filename = Server.MapPath("/") + "MyExcelFileData.xlsx";
const int startRow = 1;
IList<double> exampleDataList = new List<double>();
var existingFile = new FileInfo(filename);
enter code here
using (var package = new ExcelPackage(existingFile))
{
    ExcelWorkbook workBook = package.Workbook;
    var currentWorksheet = workBook.Worksheets.First();
    for (int rowNumber = startRow + 1; rowNumber <= currentWorksheet.Dimension.End.Row; rowNumber++)
    {
        var col1Value = Convert.ToDouble(currentWorksheet.Cells[rowNumber, 1].Value);
        exampleDataList.Add(col1Value);
    }
}

First change this:先改这个:

IList<double> exampleDataList = new List<double>();

to:到:

List<double> exampleDataList = new List<double>();

There is no need to use interface instead of concrete type for a local variable.对于局部变量,不需要使用接口而不是具体类型。 Then you'll be able to write:然后你就可以写:

exampleDataList.AddRange(
    Enumerable.Range(startRow + 1, currentWorksheet.Dimension.End.Row)
    .Select(i => Convert.ToDouble(currentWorksheet.Cells[i, 1].Value)));

You first create an enumeration with numbers from startRow + 1 to currentWorksheet.Dimension.End.Row using Enumerable.Range() helper function.首先使用Enumerable.Range()辅助函数创建一个从startRow + 1currentWorksheet.Dimension.End.Row Enumerable.Range() Then you project that sequence to something else using Select() .然后您使用Select()将该序列投影到其他内容。 Lambda just mimic what you did inside your for loop. Lambda 只是模仿你在for循环中所做的。

If you're learning LINQ stuff I strongly suggest to take a look to EduLINQ articles (from our Jon Skeet).如果您正在学习 LINQ 的东西,我强烈建议您查看EduLINQ文章(来自我们的Jon Skeet)。 They're well done and you'll understand many details about how it could be implemented.他们做得很好,你就会明白它可以如何实现的许多细节。

Edit: as pointed out by rae1n in comment if exampleDataList contains only data from this LINQ query (you don't need to add things before query) then you can use ToList() to convert enumeration returned by Select() directly into a List<double> .编辑:作为由rae1n指出注释如果exampleDataList包含此LINQ查询仅数据(你不需要添加查询以前的事情),那么你可以使用ToList()由返回转换枚举Select()直接进入List<double> .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM