从实例化方法之外closures/部署Syncfusion XlsIO实例

我正在尝试做的是将文件位置和工作表名称传递给Syncfusion的XLSIO实例,并从中读取信息以驱动C#中的Selenium脚本。 我做了那个工作 当我试图将其分解成外部类时遇到了一个问题,所以我可以为Selenium脚本的不同部分调用不同的工作表。

使用当前的代码,我最终在var range = worksheet.UsedRange;的空对象var range = worksheet.UsedRange; 因为在表单对象成功传递时,底层对象(excelEngine和工作簿)已经从ExcelDataReader方法中抛弃了。

如果我删除closures和处置,它都运行并按预期login。 但是,我仍然需要清理,因为将Excel的实例和电子表格打开导致其他问题,当我需要以后使用它。

如果我在创build列表后尝试closures/处理,则对象不是该方法的一部分,并且找不到它们以closures/处置它们。

那么,即使我已经处理了引擎,或者在离开该方法后如何处理引擎,我又该如何通过列表创build方法所需的一切呢? 或者,我应该分开不同的方法?

注意:我从列表创build中抛出ExcelDataReader的原因是因为我打算将不同的表单parameter passing给整个自动化项目的驱动程序不同部分。 如果我不能做这个工作,我将不得不放弃ExcelDataReader中的function到每个不同列表的列表创build块。 我可以做到这一点,我知道它的作品,但它只是感觉sl。。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syncfusion.XlsIO; using System.IO; using System.Data; using System.Runtime.Remoting.Messaging; namespace ConsoleApp7 { public class Login { public string Usr { get; set; } public string Pwd { get; set; } } public class DataFeed { public string FileName { get; set; } public string Worksheet { get; set; } } interface IListBuilder { void BuildList(DataFeed feed); } enum ListType { LoginList, UrlList, } public static class DoTheWork { public class LoginList : IListBuilder { public void BuildList(DataFeed feed) { var sheet = DoTheWork.ExcelDataReader(feed); DoTheWork.loginList(sheet); } } public static IWorksheet ExcelDataReader(DataFeed feed) { // instantiate Syncfusion xslio ExcelEngine excelEngine = new ExcelEngine(); IApplication application = excelEngine.Excel; //read file to stream IWorkbook workbook = application.Workbooks.Open(feed.FileName); // get worksheet var sheet = workbook.Worksheets[feed.Worksheet]; workbook.Close(); excelEngine.Dispose(); return sheet; } public static List<Login> loginList(IWorksheet sheet) { var worksheet = sheet; var range = worksheet.UsedRange; List<Login> loginList = new List<Login>(); for (var i = 2; i <= range.LastRow; i++) { if (!string.IsNullOrEmpty(range[i, 1].Text) && !string.IsNullOrEmpty(range[i, 2].Text)) { loginList.Add(new Login { Usr = range[i, 1].Text, Pwd = range[i, 2].Text, }); } } return loginList; } } } 

这是我从主内部调用它的方式:

  IListBuilder list = new DoTheWork.LoginList(); DataFeed feed = new DataFeed { FileName = @"C:\source\repos\ConsoleApp7\TestData.xlsx", Worksheet = "usr" }; IWorksheet sheet = DoTheWork.ExcelDataReader(feed); var logins = DoTheWork.loginList(sheet); var xUserName = logins[0].Usr; var xPassword = logins[0].Pwd; 

我们推荐使用ExcelDataReader方法之外的IWorkbook.Close()方法,如下面的代码片段所示。

  IWorksheet sheet = DoTheWork.ExcelDataReader(feed); var logins = DoTheWork.loginList(sheet); sheet.Workbook.Close(); // Closing the workbook 

我们已经准备了一个简单的示例与您的代码片段,以实现您的要求,可以从以下链接下载:

样品链接: 样品