C# 使用更好的方式读取excel数据

C# 使用更好的方式读取excel数据,c#,.net,excel,.net-core,openxml,C#,.net,Excel,.net Core,Openxml,现在,我从excel中获取数据,并通过行循环,根据条件处理结果,就像将结果存储在对象中以供进一步处理一样 excel表大约是20MB,记录数接近7000,我正在使用OpenXML从excel文件中获取数据,如下面代码中所述 string filePath = @"C:\weather-Data\DesignConditions_p.xlsx"; using FileStream fs = new FileStream(filePath, Fil

现在,我从excel中获取数据,并通过行循环,根据条件处理结果,就像将结果存储在对象中以供进一步处理一样

excel表大约是20MB,记录数接近7000,我正在使用OpenXML从excel文件中获取数据,如下面代码中所述

        string filePath = @"C:\weather-Data\DesignConditions_p.xlsx";
        using FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        using SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false);
        WorkbookPart workbookPart = doc.WorkbookPart;
        SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
        SharedStringTable sst = sstpart.SharedStringTable;

        Sheet firstSheet = workbookPart.Workbook.Descendants<Sheet>().First();
        Worksheet sheet = ((WorksheetPart)workbookPart.GetPartById(firstSheet.Id)).Worksheet;

        var rows = sheet.Descendants<Row>();
        var weatherDataList = new List<WeatherStation>();
        foreach (Row row in rows.Skip(5)) // it is taking almost more than 60 minutes to process and enter into the if loop below (country.Equals("USA"))
        {
            var weatherData = new WeatherStation();
            string country = GetCellValue(filePath, "Annual", $"B{row.RowIndex.ToString()}");
            if (country.Equals("USA"))
            {
                weatherData.CountryAbbreviation = country;
                weatherData.StateAbbreviation = GetCellValue(filePath, "Annual", $"C{row.RowIndex.ToString()}");
                weatherData.Number = GetCellValue(filePath, "Annual", $"E{row.RowIndex.ToString()}");
                ......
                .......
            }
        }
string filePath=@“C:\weather Data\DesignConditions\u p.xlsx”;
使用FileStream fs=newfilestream(filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
使用SpreadsheetDocument doc=SpreadsheetDocument.Open(fs,false);
WorkbookPart WorkbookPart=doc.WorkbookPart;
SharedStringTablePart sstpart=workbookPart.GetPartSoftType().First();
SharedStringTable sst=sstpart.SharedStringTable;
Sheet firstSheet=workbookPart.Workbook.subjects().First();
工作表工作表=((WorksheetPart)workbookPart.GetPartById(firstSheet.Id)).Worksheet;
var rows=sheet.subjections();
var weatherDataList=新列表();
foreach(Row-in-rows.Skip(5))//处理并进入下面的if循环(country.Equals(“USA”))几乎需要60多分钟
{
var weatherData=新气象站();
字符串country=GetCellValue(文件路径,“年度”,“美元”B{row.RowIndex.ToString()});
如果(国家等于(“美国”))
{
weatherData.country缩写=国家;
weatherData.state缩写=GetCellValue(文件路径,“年”,“元”C{row.RowIndex.ToString());
weatherData.Number=GetCellValue(文件路径,“年”,“元”E{row.RowIndex.ToString()});
......
.......
}
}
在从excel读取数据时,是否有人能为我指出优化处理时间的正确方向,我正在使用.Net Core进行此应用程序


提前感谢。

您可以使用“SAX”方法,这样您可以分部分读取文件,以便处理和IO速度更快:

//SAX方法。
静态无效ReadExcelFileAX(字符串文件名)
{
使用(SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Open(文件名,false))
{
WorkbookPart WorkbookPart=电子表格文档.WorkbookPart;
WorksheetPart WorksheetPart=workbookPart.WorksheetParts.First();
OpenXmlReader=OpenXmlReader.Create(工作表部分);
字符串文本;
while(reader.Read())
{
if(reader.ElementType==typeof(CellValue))
{
text=reader.GetText();
控制台。写入(文本+“”);
}
}
Console.WriteLine();
Console.ReadKey();
}
}


除此之外,您还可以查找一个具有更快阅读功能的库/ NuGET包,因为我看不到有更多的方法来对该代码进行更多的调整。

如果您感兴趣的是数据(而不是格式化),考虑直接数据连接,如ADO.NET通过ADODB(在Windows上)或通过ODBC。或者类似的东西。@ZevSpitz我需要根据特定的行索引获取单元格。您可以构建自己的索引。您可以使用Enumerable的重载。选择提供索引的,或者您可以创建自己的变量来保存索引。我需要基于行索引获取单元格值,我不确定如何使用SAX实现这一点approach@EnigmaState您可以使用
Read()
Skip()
控制流量,但也可以逐行读取。请参阅:数据是否总是向下5行?