ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多个工作表一起使用

2019-10-28 17:15:33  阅读:243  来源: 互联网

标签:worksheet c 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类中还有一些未显示的方法可以处理将数据写入正确的位置.

这一切似乎都可以正常工作,并且在调试时,我可以看到用新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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有