更快地searchexcel文件

我有ac#.net应用程序读写excel文件。 我search每个文件的20个单元格的数据比较,所以search10000个文件tkes 70秒这是非常长的! 任何更好的解决scheme的想法,使其更快。 这里是读取function:

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; } 

这里是执行search的代码:

 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); 

我做了很多testing,似乎我的阅读function需要90%的search时间在一个文件中。

如果我是你的话,我更喜欢multithreading技术,但是肯定会占用很多的CPU,但是与单线程相比,速度快了x倍。

这是一个很好的解释multithreading教程,也很好用!

我build议你尝试使用OLEDB驱动程序,而不是Office.Interop。 从Excel中读取数据要快得多。

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

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

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