从实例化方法之外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
我们已经准备了一个简单的示例与您的代码片段,以实现您的要求,可以从以下链接下载:
样品链接: 样品