gpt4 book ai didi

c# - SpreadsheetLight 处理多个工作表

转载 作者:行者123 更新时间:2023-11-30 15:26:49 25 4
gpt4 key购买 nike

我正在使用 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<>开始写。

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

后一种方法在任何时候都占用较少的内存,但占用更多的 CPU 周期,因为您一直在工作表之间来回移动。来回的事情相当于加载一个工作表,卸载它,然后加载另一个工作表等等。

关于c# - SpreadsheetLight 处理多个工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com