Как ускорить создание книги с помощью Aspose? - PullRequest
2 голосов
/ 25 марта 2019

Я работаю над некоторым кодом, в котором мне нужно открыть излишки, изменить некоторые значения ячеек, а затем пересчитать формулы всего файла, чтобы получить два конкретных значения и проинформировать их.

Проблема в том, что мне приходится делать это с большим количеством файлов, все с разными именами и по разным путям, и каждый раз на создание рабочей книги уходит слишком много времени.

Даже работа только с одним 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 ().

Спасибо.

1 Ответ

1 голос
/ 26 марта 2019

Прежде всего, мы рекомендуем вам попробовать нашу последнюю версию, так как в ней есть больше улучшений и исправлений, касающихся управления памятью и затрат времени при чтении или записи файлов. Считаете ли вы, что Aspose.Cells требует больше времени на создание экземпляра Рабочей книги или же он тратит больше времени на вычисление формул в рабочей книге? Я полагаю, вы можете попробовать некоторые меры, чтобы минимизировать стоимость памяти и ускорить процессы.

  1. Если процесс занимает больше времени и занимает больше памяти при открытии файла через 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);
    
  2. Попробуйте использовать некоторые параметры фильтрации данных при загрузке рабочих книг. Например, см. документ о том, как фильтровать данные / содержимое или объекты при загрузке книги.

  3. Попробуйте загрузить нужные листы и не загружайте ненужные листы в рабочую книгу. Это может улучшить производительность и потреблять меньше памяти. Этот подход полезен при работе с большой рабочей книгой, состоящей из множества рабочих таблиц. например Пример кода:

    // Определить новую книгу.

    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.

...