更快地在excel文件中进行搜索

时间:2013-10-01 15:37:22

标签: c# .net excel search

我有一个可以从excel文件读写的c#.net应用程序。我的搜索比较每个文件中20个单元格的数据,因此在10000个文件中搜索70秒,这是非常长的!任何更好的解决方案的想法,使其更快。 这是读取功能:

 public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null)
    {
        string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\AddIns\\mDF_XLcalendar.xla");

        deleg = fn;
        app = new Excel.Application();

        app.Workbooks.Open(addInPath);
        app.Workbooks.Open(fileName);

        app.ScreenUpdating = true;
        app.DisplayAlerts = true;
        app.Visible = visibility;
        app.UserControl = true;
        app.WindowState = Excel.XlWindowState.xlMaximized;

        EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);
        EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave);

        app.WorkbookBeforeClose += EventDel_BeforeBookClose;
        app.WorkbookBeforeSave += EventSave_BeforeBookClose;

    }

以下是执行搜索的代码:

string searchString = ((RichTextBox)searchObject.LstObject[0]).Text.Trim();

            bool contain = ExcelFunctions
                                .RemoveDiacritics(ExcelFunctions.Read(GetSummaryXl, coord))
                                .ToLower()
                                .Contains(ExcelFunctions.RemoveDiacritics(searchString).ToLower());

            return string.IsNullOrEmpty(searchString) || (!string.IsNullOrEmpty(searchString) && contain);

我做了很多测试,似乎我的读取功能在一个文件中占用了90%的搜索时间。

3 个答案:

答案 0 :(得分:2)

我建议您尝试使用OLEDB驱动程序而不是Office.Interop。从excel读取数据要快得多。

有关如何连接到Excel的示例,请查看ConnectionString.com

答案 1 :(得分:0)

如果我是你,我更喜欢多线程,它肯定会消耗大量的CPU,但与单线程相比,它的速度要快x倍。

This是一个很好解释的多线程教程,也很容易使用!

答案 2 :(得分:0)

您遇到性能问题的根本原因是,每次读取单元格都是跨越COM / .Net边界的行程,这非常昂贵。如果OLEDB不适合,请尝试跨越边界一次读取所有数据;这可以通过从VBA宏返回一个二维数组并通过互操作执行宏来完成。

另一个想法是在C ++中开发一个COM加载项,但这要复杂得多。