我正在使用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类中,因为其中的其他内容仍然是相关的。
还有其他建议吗?
发布于 2015-05-04 08:14:27
推荐和有效的方法是首先将所有要写入内存的日志存储起来(使用List<>或其他东西)。然后,在编写时,选择工作表,从第一个List<>中写入所有内容,选择第二个工作表,从第二个List<>中写入所有内容,选择第三个工作表,从第三个List<>中写入所有内容。
如果内存是问题,则选择第一个工作表,将日志块写入单元格值,选择第二个工作表,将日志块写入单元格值(由于当前选择了第二个工作表,因此将在第二个工作表中),选择第三个工作表,编写日志块。然后用上面的内容迭代每个日志块。
后一种方法在任何时候都占用较少的内存,但占用更多的CPU周期,因为您一直在工作表之间来回往返。来回操作相当于加载一个工作表,卸载它,然后加载另一个工作表等等。
https://stackoverflow.com/questions/28596456
复制相似问题