Excel工作簿 - 从C#读取大幅慢?

Rog*_*oge 5 c# excel

我正在尝试从excel工作簿中读取数据,并注意到需要很长时间才能阅读3560行和7列的工作表,大约需要1分17秒.我所做的只是遍历整个工作表并将值存储在列表中.

这是正常的,还是我做错了什么?

 static void Main(string[] args)
    {
        List<string> testList = new List<string>();
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook workbook = excelApp.Workbooks.Open(@"C:\Users\rnewell\Desktop\FxData.xlsx");
        Excel.Worksheet worksheet = workbook.Sheets[1];
        Excel.Range range = worksheet.UsedRange;

        int rowCount = range.Rows.Count;
        int colCount = range.Columns.Count;



        int rowCounter = 1;
        int colCounter = 1;

        while (rowCounter < rowCount)
        {
            colCounter = 1;
            while (colCounter <= colCount)
            {
                //Console.Write(range.Cells[rowCounter, colCounter].Value2.ToString() + " ");
                testList.Add(range.Cells[rowCounter, colCounter].Value2.ToString());
                colCounter++;
            }
            Console.WriteLine();
            rowCounter++;


        }



        Console.ReadKey();
        excelApp.Workbooks.Close();


    }
Run Code Online (Sandbox Code Playgroud)

jwg*_*jwg 7

@TimWilliams的评论是正确的答案.读取单个单元格只需读取任何大小的范围即可.这是与COM层交谈的开销,而且你会招致数千次.您应该将范围写入a object[,],然后逐个单元格访问该数组.

    int rowCount = range.Rows.Count;
    int colCount = range.Columns.Count;

    object[,] values= range.Value2;

    int rowCounter = 1;
    int colCounter = 1;

    while (rowCounter < rowCount)
    {
        colCounter = 1;
        while (colCounter <= colCount)
        {
            // check for null?
            testList.Add(values[rowCounter, colCounter].ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,与普通的C#数组一样,该数组将基于一个而不是基于零.数据将从1到rowCount,从1到colCount,但Rows和Columns属性将返回rowCount和colCount,而不是1 + rowCount和1 + colCount.如果你想要回写数据,你可以使用正确大小的从零开始的数组(实际上你必须使用AFAIK,因为你不能创建一个基于单一的数组)并且它可以正常工作.


Dam*_*Arh 5

由于您是从Open XML(* .xlsx)文件格式加载数据,因此建议您使用Open XML SDK。它不会在后台启动Excel总是一件好事,特别是如果您需要非交互地运行代码时。

我还写了一篇关于在Excel中访问数据的不同方法的博客文章,您可能会觉得有用。