SpreadsheetLightを使用して、WinForms プロジェクトからログ ファイルを書き込んでいます。Interop
私の意図は、同じファイル内の 3 つのワークシートにログ エントリを書き込むことです。回避できる場合は 使用を避けたいと思っています。
行タイトルが事前に入力された 3 つのワークシートを含む Excel で作成されたテンプレート ファイルから始めます。各ワークシートには同じ基本プロパティ (個別に異なる可能性があります) があるため、各シートをクラスにカプセル化します。このような:
/// <summary>
/// Encapsulate the info we need to know about each worksheet in order to populate properly
/// </summary>
public class LogSheet
{
public SLDocument data;
public SLWorksheetStatistics stats;
public int RowCount;
public int ColumnCount;
public int currentColumn; //indicates what column you want to be writing to
public List<string> rowNames = new List<string>(); //used to make sure you're writing new data to the right row
public List<string> columnNames = new List<string>(); //used by GetLatestRun() to check if data already exists for a given serial number
public LogSheet(string sheet)
{
this.data = new SLDocument(_path, sheet);
this.stats = this.data.GetWorksheetStatistics();
this.RowCount = this.stats.EndRowIndex;
this.ColumnCount = this.stats.EndColumnIndex;
currentColumn = GetLatestRun();
for (int i = 1; i < RowCount + 1; i++)
{
this.rowNames.Add(this.data.GetCellValueAsString(i, 1));
}
for (int i = 1; i < ColumnCount + 1; i++)
{
this.columnNames.Add(this.data.GetCellValueAsString(1, i));
}
}
}
LogSheet
クラスには示されていませんが、適切な場所へのデータの書き込みを処理するメソッドもいくつかあります。
これはすべて正常に動作しているように見えます。デバッグ時に、インスタンス化された 3 つのワークシートのそれぞれにnew LogSheet(<sheetName>)
、書き込み後に想定されるデータが含まれていることがわかります。
問題は、データを保存したいときに で回避できることですがthis.data.Save()
、1 つのワークシートしか保存されず、Save()
メソッドがターミナルで Excel ファイルを閉じるため、他の 2 つは宙に浮いたままになっています。もちろん、スプレッドシートを強制終了し、シートに参照するものがなくなったため、他の2つのシートのいずれかでメソッドを試すSave()
と、例外が発生します。結果のファイルには、最初に保存したときのデータしかありません。"Object reference not set to an object"
Save()
これを回避する方法についての私の最善の推測は、SLDocument
シートごとに新しいインスタンスを作成せず、代わりにSLDocument.SelectWorksheet()
特定のワークシートに書き込みたいたびに使用することですが、それでも LogSheet クラスにカプセル化したままにしたいと考えています。まだ関連しています。
他の提案はありますか?