从实例化方法之外关闭/处理Syncfusion XlsIO实例

时间:2017-10-26 17:50:30

标签: c# excel selenium syncfusion

我尝试做的是将文件位置和工作表名称传递给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;

1 个答案:

答案 0 :(得分:1)

我们建议在ExcelDataReader方法之外使用IWorkbook.Close()方法,如以下代码段所示。

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

我们准备了一个包含您的代码段的简单示例,以满足您的要求,可以从以下链接下载:

示例链接:Sample