我尝试做的是将文件位置和工作表名称传递给Syncfusion的XLSIO实例,并从中读取信息以在C#中驱动Selenium脚本。我做了那个工作。当我试图将其分解为外部类时,我遇到了一个问题,因此我可以为Selenium脚本的不同部分调用不同的工作表。
使用当前代码,我最终在var range = worksheet.UsedRange;
处得到一个空对象,因为在成功传递工作表对象时,底层对象(excelEngine和工作簿)已从ExcelDataReader方法中处理掉。
如果我删除了关闭并处置掉了,它会全部运行并按预期登录。但是,我仍然需要清理,因为当我需要在以后使用它时,保持excel实例和电子表格打开会导致其他问题。
如果我在创建列表后尝试关闭/处置,则对象不是该方法的一部分,它无法找到它们来关闭/处理它们。
那么,即使我已经处理好引擎,或者如何在离开该方法后处理引擎,我如何传递列表创建方法所需的所有内容?或者,我应该以不同的方式分解方法吗?
注意:我从列表创建中打破ExcelDataReader的原因是因为我计划将该代码与不同的工作表参数一起使用,传递给整个自动化项目的驱动程序的不同部分。如果我无法完成这项工作,我将不得不将ExcelDataReader中的功能放入每个不同列表的列表创建块中。我能做到这一点,我知道它有效,但它只是感觉草率。
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;
}
}
}
这就是我从main里面调用它的方式:
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;
答案 0 :(得分:1)
我们建议在ExcelDataReader方法之外使用IWorkbook.Close()方法,如以下代码段所示。
IWorksheet sheet = DoTheWork.ExcelDataReader(feed);
var logins = DoTheWork.loginList(sheet);
sheet.Workbook.Close(); // Closing the workbook
我们准备了一个包含您的代码段的简单示例,以满足您的要求,可以从以下链接下载:
示例链接:Sample