我正在使用SpreadsheetLight从 WinForms 项目中写入日志文件。我的意图是将日志条目写入同一个文件中的三个工作表,如果可以避免的Interop
话,我真的想避免使用它。
我从一个用 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
类中没有显示的方法来处理将数据写入正确的位置。
这一切似乎工作正常,在调试时,我可以看到实例化的三个工作表中的每一个都new LogSheet(<sheetName>)
包含在我向它们写入内容之后它们应该包含的数据。
问题是,当我想保存数据时,我可以侥幸逃脱this.data.Save()
,但它只保存一个工作表,而另外两个现在处于不确定状态,因为该Save()
方法是终端并关闭 Excel 文件。在其他任何一张纸上尝试该Save()
方法,最终都会出现异常"Object reference not set to an object"
,因为当然,Save()
杀死了我的电子表格,并且这些表格不再有任何可参考的内容。结果文件只有我第一次保存的数据。
对于如何解决这个问题,我最好的猜测是不要SLDocument
为每张工作表实例化一个新工作表,而是在SLDocument.SelectWorksheet()
每次我想写入特定工作表时使用,但我仍然希望将内容封装在 LogSheet 类中,因为其中的所有其他内容都是仍然相关。
还有其他建议吗?