簡體   English   中英

SpreadsheetLight使用多個工作表

[英]SpreadsheetLight working with multiple worksheets

我正在使用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類中的東西因為那里的其他一切仍然相關。

還有其他建議嗎?

建議的有效方法是首先將所有日志存儲在內存中(使用List <>或其他東西)。 然后在編寫時,選擇工作表,從第一個List <>中編寫所有內容,選擇第二個工作表,從第二個List <>中編寫所有內容,選擇第三個工作表,從第三個List <>中寫入所有內容。

如果內存是個問題,那么選擇第一個工作表,將日志塊寫入單元格值,選擇第二個工作表,將日志塊寫入單元格值(將在第二個工作表中,因為當前選擇了第二個工作表),選擇第三個工作表,寫入日志塊。 然后使用上面的內容迭代每個日志塊。

后一種方法在任何時候都占用較少的內存,但由於您在工作表之間來回切換,因此需要更多的CPU周期。 來回的事情相當於加載一個工作表,卸載它,然后加載另一個工作表等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM