其他分享
首页 > 其他分享> > 多个工作表一起使用

多个工作表一起使用

作者:互联网

我正在使用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类中还有一些未显示的方法可以处理将数据写入正确的位置.

这一切似乎都可以正常工作,并且在调试时,我可以看到用新LogSheet(< sheetName>)实例化的三个工作表中的每一个都包含了我向它们写东西之后应该得到的数据.

问题是,当我要保存数据时,我可以使用this.data.Save(),但是它只保存一个工作表,而另两个工作表则处于保留状态,因为Save()方法是terminal and关闭Excel文件.在其他两个工作表中尝试使用Save()方法都会导致异常“对象引用未设置为对象”,这是因为,当然,Save()杀死了我的电子表格,并且工作表不再具有任何要引用的内容.结果文件仅包含我第一次保存的数据.

关于如何解决此问题的最佳猜测是,不要为每个工作表实例化一个新的SLDocument,而是在每次要写入特定工作表时都使用SLDocument.SelectWorksheet(),但是我仍然想将所有内容封装在LogSheet类中因为其中的所有其他内容仍然相关.

还有其他建议吗?

解决方法:

推荐的有效方式是首先将所有要写入的日志存储在内存中(使用List或类似的东西).然后,在编写时,选择工作表,从第一个List编写所有内容,选择第二个工作表,从第二个List编写所有内容,选择第三个工作表,从第三个List编写所有内容.

如果存在内存问题,则选择第一个工作表,将日志块写入单元格值,选择第二个工作表,将日志块写入单元格值(将在第二个工作表中,因为当前已选择第二个工作表),选择第三个工作表,写入日志块.然后使用以上内容遍历每个日志块.

后一种方法每次都占用较少的内存,但是会占用更多的CPU周期,因为您需要在工作表之间来回移动.来回的操作等效于加载一个工作表,卸载它,然后加载另一个工作表,依此类推.

标签:worksheet,c,spreadsheetlight
来源: https://codeday.me/bug/20191028/1954022.html