Вычисление пользовательских функций в Excel с помощью C # Excel Interop - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь создать надстройку непосредственно из C #, чтобы при открытии книги и выполнении Workbook.Calculate () пользовательские функции (UDF), определенные во внешнем надстройке, правильно вычислялись на листе.В настоящее время я перебираю каждое добавление и простые настройки:

AddIn.Installed = true

Это не работает.C # вообще не загружает надстройки, и я хочу избегать использования VBA.Я хочу открыть рабочую книгу Excel с загруженным конкретным дополнением, выполнить полное вычисление и обновить все значения рабочего листа, включая ячейки с UDF.

Спасибо за любую помощь ....

Некоторые коды:

Excel.Workbook wkbk = ExcelApp.ActiveWorkbook;

        Excel.XlFixedFormatType paramExportFormat = Excel.XlFixedFormatType.xlTypePDF;
        Excel.XlFixedFormatQuality paramExportQuality = Excel.XlFixedFormatQuality.xlQualityStandard;
        bool paramOpenAfterPublish = false;
        bool paramIncludeDocProps = true;
        bool paramIgnorePrintAreas = true;
        object paramFromPage = Type.Missing;
        object paramToPage = Type.Missing;

        ExcelApp.Visible = true;
        //foreach (Excel.AddIn aiTemp in ExcelApp.AddIns)
        //{
        //    if (aiTemp.Name.Contains(""))
        //    {
        //        aiTemp.Installed = false;
        //        aiTemp.Installed = true;
        //    }
        //}            

        while (ExcelApp.CalculationState == Microsoft.Office.Interop.Excel.XlCalculationState.xlCalculating)
        {
            Thread.Sleep(50);
        }
        ExcelApp.CalculateFull();
        var wksht = wkbk.ActiveSheet;
        Excel.Range rng = ((Excel.Worksheet)wksht).get_Range("B1", "B1");
        rng.Calculate();
        //EnsureCalcFinished();

        ExcelApp.Visible = false;
        wkbk.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, PathToDocument.Replace(".xlsx", ".pdf"), paramExportQuality, true, false, Type.Missing, Type.Missing, true,Type.Missing);

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Ниже приведен алгоритм загрузки надстроек Excel, поэтому при открытии книги Excel в расчет включаются пользовательские функции, определенные в надстройке:

1) Инициализация приложения Excel

ExcelApp = new Excel.Application();

2) Загрузить надстройки *

 foreach (Excel.AddIn ai in ExcelApp.AddIns)
        {
            ai.Installed = false;
            ai.Installed = true;
            ExcelApp.Wait(50);
        }

** Ключ заключается в загрузке надстроек перед открытием книги Excel.

3) Откройте книгу Excel, которая будеттриггерные вычисления

4) Установите режим расчета на ручной, чтобы любые изменения в Interop не вызывали длительный пересчет

ExcelApp.Calculation = Microsoft.Office.Interop.Excel.XlCalculation.xlCalculationManual;  

5) Выполните любые манипуляции и выполните calc

ExcelApp.CalculateFull();

6) Утилизируйте объекты Excel соответствующим образом

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

0 голосов
/ 08 декабря 2011

ОБНОВЛЕНИЕ: Я нашел ссылку с помощью метода, который я использую для регистрации пользовательских функций.

Ссылка: http://msdn.microsoft.com/en-us/library/ms173189(v=vs.80).aspx

В Excel вам нужно перейти в Параметры -> Надстройки => Надстройка Excel (Go ..) => автоматизация = выберите библиотеку и нажмите ОК.Как только вы сделаете это один раз, он будет автоматически загружаться каждый раз, когда вы открываете Excel.

...