加快在 Excel 文件中的搜索速度

本文关键字:搜索 速度 文件 Excel | 更新日期: 2023-09-27 18:33:24

我有一个从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% 的搜索时间。

加快在 Excel 文件中的搜索速度

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

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

如果我

是你,我更喜欢多线程,它肯定会占用大量 CPU,但与单线程相比,它快 x 倍。

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

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

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