SpreadsheetLight使用多个工作表

时间:2015-02-19 00:12:11

标签: c# worksheet spreadsheetlight

我正在使用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类中,因为其中的所有内容仍然相关。

还有其他建议吗?

1 个答案:

答案 0 :(得分:4)

推荐且有效的方法是首先将所有日志存储在内存中(使用List&lt;&gt;或其他东西)。然后在写作时,选择工作表,从第一个List&lt;&gt;写入所有内容,选择第二个工作表,从第二个List&lt;&gt;写入所有内容,选择第三个工作表,从第三个List&lt;&gt;中写出所有内容。< / p>

如果内存有问题,那么选择第一个工作表,将日志块写入单元格值,选择第二个工作表,将日志块写入单元格值(将在第二个工作表中,因为当前选择了第二个工作表),选择第三个工作表,写日志块。然后使用上面的内容迭代每个日志块。

后一种方法在任何时候都占用较少的内存,但由于您在工作表之间来回切换,因此需要更多的CPU周期。来回的东西等同于加载一个工作表,卸载它,然后加载另一个工作表等等。