2017-10-26 15 views
0

私がしようとしているのは、ファイル位置とワークシート名をSyncfusionのXLSIOのインスタンスに渡し、C#でSeleniumスクリプトを駆動するための情報を読み込むことです。私はその仕事をした。 Seleniumスクリプトのさまざまな部分に異なるワークシートを呼び出すことができるように、私は外部クラスに分解しようとしたときに問題に遭遇しました。インスタンス化メソッド外からのSyncfusion XlsIOインスタンスのクローズ/ディスペンス

var range = worksheet.UsedRange;で現在のコードでは、シートオブジェクトが正常に渡されている間にExcelDataReaderメソッド内で基になるオブジェクト(excelEngineとブック)が削除されています。

クローズを削除して破棄すると、すべてが実行され、期待どおりにログインします。しかし、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; 
    } 

} 
} 

これは私がメインの内側からそれを呼んでいる方法です:

 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

我々は次のコードスニペットのようにExcelDataReader方法外IWorkbook.Close()メソッドを使用することをお勧めします。

サンプルリンク:完全に働いたSample

+0

とは、それは私のコードを簡素化

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

は、我々は次のリンクからダウンロードすることができ、あなたの要件を達成するために、あなたのコードスニペットで簡単なサンプルを用意しました!ありがとうございました! – Haendler

関連する問題