使用linq从excel表中读取

时间:2014-01-16 14:57:03

标签: c# excel linq

我正在尝试学习linq并需要帮助将以下for循环转换为linq查询。在for循环结束时,我应该能够解析exampleDataList并获取值。我该怎么做?

    string filename = Server.MapPath("/") + "MyExcelFileData.xlsx";
    const int startRow = 1;
    IList<double> exampleDataList = new List<double>();
    var existingFile = new FileInfo(filename);
    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);
        }
    }

1 个答案:

答案 0 :(得分:5)

首先改变这个:

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

为:

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

对于局部变量,不需要使用接口而不是具体类型。然后你就可以写下:

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

首先使用startRow + 1辅助函数创建一个包含currentWorksheet.Dimension.End.RowEnumerable.Range()的数字的枚举。然后使用Select()将该序列投影到其他内容。 Lambda只是模仿你在for循环中所做的事情。

如果您正在学习LINQ内容,我强烈建议您查看EduLINQ篇文章(来自我们的 Jon Skeet)。他们做得很好,您将了解有关如何实施的许多细节。

编辑正如comment中的rae1n所指出的,如果exampleDataList仅包含来自此LINQ查询的数据(您不需要在查询之前添加内容)然后,您可以使用ToList()Select()返回的枚举直接转换为List<double>