我正在处理一些代码,在这些代码中我必须打开excel,更改一些单元格的值,然后重新计算整个文件的公式,以便获得两个特定的值并告知它们。
问题在于,我必须使用大量文件(每个文件使用不同的名称和路径)来进行此操作,并且每次创建工作簿都花费了太多时间。
即使只使用一个excel进行处理也要花费几秒钟的时间,而最大的困难就是创建工作簿对象。
有什么方法可以加快这个过程吗?
这是我的代码:
class Program
{
private class MyWorkbook : IDisposable
{
public Workbook Wb { get; set; }
public MyWorkbook(Workbook wb)
{
Wb = wb;
}
public void Dispose()
{
}
}
static void Main(string[] args)
{
Console.WriteLine("Started: " + DateTime.Now.ToString());
int i = 0;
while (i <= 10000)
{
using (MyWorkbook workbook = new MyWorkbook(new Workbook(@"C:\AppData\MyExcels\abcdefg.xlsm")))
{
workbook.Wb.Settings.CreateCalcChain = false;
workbook.Wb.Worksheets[1].Cells["M21"].Value = 5;
workbook.Wb.Worksheets[1].Cells["M22"].Value = 5;
workbook.Wb.Worksheets[1].Cells["M23"].Value = 5;
workbook.Wb.CalculateFormula();
Console.WriteLine(workbook.Wb.Worksheets[1].Cells["L81"].Value);
}
Console.WriteLine("Index: " + i);
i++;
}
Console.WriteLine("Finished: " + DateTime.Now.ToString());
Console.ReadLine();
}
}
注意:我使用的是自定义类,因为Aspose版本较旧并且Workbook没有Dispose()方法。
谢谢。
答案 0 :(得分:1)
首先,我们建议您尝试使用我们的最新版本,因为它在读取或写入文件时具有更多的内存管理和时间消耗方面的增强和修复。 您是否发现Aspose.Cells在工作簿的实例化上花费了更多时间,还是在工作簿中的公式计算上花费了更多时间?我想您可以尝试一些措施以最大程度地减少内存成本并加快处理速度。
如果通过API打开文件时该过程花费更多时间并消耗更多内存,则可以尝试设置MemorySetting.MemoryPreference选项以优化单元格数据的内存使用并降低总体内存成本。因此,它可以提高处理速度。请参见示例代码段以供参考: 例如 示例代码:
LoadOptions opt = new LoadOptions(); // Set the memory preferences opt.MemorySetting = MemorySetting.MemoryPreference; // Instantiate the Workbook // Load the Big Excel file having large Data set in it Workbook wb = new Workbook(dataDir+ "Book1.xlsx", opt);
在加载工作簿时尝试使用一些数据筛选选项。例如,有关加载工作簿时如何过滤数据/内容或对象的信息,请参见document。
尝试加载所需的工作表,不要在工作簿中加载不必要的工作表。这样可以提高性能并减少内存消耗。当使用由许多工作表组成的大型工作簿时,此方法很有用。 例如 示例代码:
//定义一个新的工作簿。
Workbook workbook; // Load the workbook with the spcified worksheet only. LoadOptions loadOptions = new LoadOptions(LoadFormat.Xlsx); loadOptions.LoadFilter = new CustomLoad(); // Creat the workbook. workbook = new Workbook(dataDir+ "TestData.xlsx", loadOptions); // Perform your desired task. // Save the workbook. workbook.Save(dataDir+ "outputFile.out.xlsx"); .... Here is the implementation of the CustomLoad class. ........ class CustomLoad : LoadFilter { public override void StartSheet(Worksheet sheet) { if (sheet.Name == "Sheet2") { // Load everything from worksheet "Sheet2" this.LoadDataFilterOptions = LoadDataFilterOptions.All; } else { // Load nothing this.LoadDataFilterOptions = LoadDataFilterOptions.None; } } }
PS。我是Aspose的支持开发人员/传播者。