How to read the entire worksheet from excel

扶醉桌前 提交于 2021-01-29 07:40:54

问题


I am reading data from numerous excel worksheets, but the performance is slow since I am fetching each col directly. Is there a way I can read the entire UsedRange into memory with one call? Then process the rows/cols locally?

The code I have is basically this:

xlWorkSheet = (Worksheet)_xlWorkBook.Worksheets.get_Item(1);
var range = xlWorkSheet.UsedRange;
for (var rCnt = 2; rCnt <= range.Rows.Count; rCnt++)
{
    // Process column entries
}

回答1:


I had the same problem while handling very large excel I managed to read it as range and then transformed it to List> using AsParallel() on each row It made it to run much faster

Here is the code:

private List<List<string>> ReadExcelFile(string fileName)
    {
        Excel.Application xlApp = null;
        Workbook xlWorkbook = null;
        Sheets xlSheets = null;
        Worksheet xlSheet = null;
        var results = new List<List<string>>();

        try
        {
            xlApp = new Microsoft.Office.Interop.Excel.Application();

            xlWorkbook = xlApp.Workbooks.Open(fileName, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, true, XlPlatform.xlWindows, Type.Missing,false, false, Type.Missing, false, Type.Missing, Type.Missing);

            xlSheets = xlWorkbook.Sheets as Sheets;

            xlSheet = xlSheets[1];

            // Let's say your range is from A1 to DG5200
            var cells = xlSheet.get_Range("A1", "DG5200");

            results = ExcelRangeToListsParallel(cells); 
        }
        catch (Exception)
        {
            results = null;
        }
        finally
        {
            xlWorkbook.Close(false);
            xlApp.Quit();

            if (xlSheet != null)
                Marshal.ReleaseComObject(xlSheet);
            if (xlSheets != null)
                Marshal.ReleaseComObject(xlSheets);
            if (xlWorkbook != null)
                Marshal.ReleaseComObject(xlWorkbook);
            if (xlApp != null)
                Marshal.ReleaseComObject(xlApp);
            xlApp = null;                
        }

        return results;
    }

    private List<List<String>> ExcelRangeToListsParallel(Excel.Range cells)
    {            

        return cells.Rows.Cast<Excel.Range>().AsParallel().Select(row =>
        {         
            return row.Cells.Cast<Excel.Range>().Select(cell =>
            {
                var cellContent = cell.Value2;                    
                return (cellContent == null) ? String.Empty : cellContent.ToString(); 
            }).Cast<string>().ToList();                
        }).ToList();
    }


来源:https://stackoverflow.com/questions/38531974/how-to-read-the-entire-worksheet-from-excel

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!