Как улучшить производительность кода при обновлении случайных ячеек в электронной таблице Excel - взаимодействие Excel или альтернатива - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть следующий код в c#, который мне удалось написать с различными идеями с этого сайта и других. (с помощью Microsoft Excel Interop)

public static void update_cells(string filePath, string whichSheet, List<List<object>> cellList)
        {
            Debug.WriteLine($"start updatecells at {DateTime.Now.ToString()}");
            Excel.Application xlApp;
            Workbooks xlWorkbooks;
            Workbook xlWorkbook;
            xlApp = new Excel.Application();
            xlApp.DisplayAlerts = false;
            xlApp.UserControl = false;
            xlApp.Visible = false;
            xlWorkbooks = xlApp.Workbooks;
            xlWorkbook = xlWorkbooks.Open(filePath, null, ReadOnly: false);

            Worksheet targetsheet = xlWorkbook.Worksheets[1];
            targetsheet.Activate(); // may not be needed
            for (int i = 0; i < cellList.Count; i++ )
            {
                Range my_range = targetsheet.Rows[(int)cellList[i][0] + 1].Cells[(int)cellList[i][1] +1];
                my_range.Value2 = cellList[i][2];
                Debug.WriteLine($"pass {i}");
                Debug.WriteLine((int)cellList[i][0] + 1);
                Debug.WriteLine((int)cellList[i][1] + 1);
                Debug.WriteLine(cellList[i][2]);
                Marshal.ReleaseComObject(my_range);
            }
            xlWorkbook.Close(true, Type.Missing, Type.Missing);
            Marshal.ReleaseComObject(xlWorkbook); // do I need this?
            Marshal.ReleaseComObject(xlWorkbooks); // do I need this?
            Marshal.ReleaseComObject(xlApp); // do I need this?
            Debug.WriteLine($"finish datawriter at {DateTime.Now.ToString()}");

        }

В двух словах, я извлекаю ячейки из заполненной таблицы данных (чтение / запись), которые были изменены, и сохраняю их в списке объектов. Каждый объект в списке содержит строку ячейки, столбец и значение изменения. Я не буду вдаваться в «почему», но давайте просто скажем, что для лучшего контроля. Код работает нормально, но все, что я прочитал, говорит о том, что использование взаимодействия Excel - не идеальный сценарий для решения такой задачи. Я не уверен, что моя логика c идеально подходит для достижения цели обновления случайных ячеек в электронной таблице.

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

Я посмотрел на OLEDB, чтобы читать и записывать данные в электронные таблицы. Он работает очень хорошо, и я достигаю значительных улучшений скорости по сравнению с Excel Interop, но кажется, что он отлично подходит для чтения всей электронной таблицы или добавления строк данных в мою электронную таблицу. Из того, что я исследовал, я не могу найти способ выбрать ячейку на основе строки и столбца (или много разных ячеек) и обновить

Есть ли способ сделать это быстрее или я застрял в Excel Interop?

ps любое предлагаемое чтение всегда полезно для меня, так как я довольно новичок в c# и все еще изучаю все входы и выходы. У меня часто возникают проблемы с поиском того, что я ищу: - (

спасибо

РЕДАКТИРОВАТЬ: я не ищу ответ на основе мнения. Этот код занимает 1,5 - 2 секунды, чтобы выполнить его задача. Я ищу ответ, в котором выполнение кода выполняется быстрее, чем то, что он делает.

...