Как установить значение в колонтитуле Excel с использованием Microsoft.Office.Interop.Excel в расширении iManage?

Вопрос или проблема

Я разрабатываю настольное расширение для iManage Work Desktop на .NET Framework 4.8, которое должно уметь устанавливать определенное значение в нижнем колонтитуле документов Word, Excel и PowerPoint.

Мне удалось реализовать это в Word, но в Excel это не сработало. Изучив документацию по interop, я пришел к выводу, что значение нижнего колонтитула можно установить с помощью:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.pagesetup.centerfooter?view=excel-pia#microsoft-office-interop-excel-pagesetup-centerfooter

Тем не менее, используя pageSetup.CenterFooter, я могу успешно получить значение нижнего колонтитула, но не могу его установить.

Я пробовал подписаться на события WorkbookBeforeSave и WorkbookSaveAs в IExcelPlugInHost из iManage.Work.Tools в методе Initialize, и мне удалось успешно запускать функции, когда эти события возникают в iManage.

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

using System;
using iManage.Work.Tools;
using Microsoft.Office.Interop.Excel;

namespace iManageExcelPlugin
{
    public class AddFooterOnFileSaveExcel : PlugInBase
    {
        private int testvalue = 1;

        public override bool Initialize(iManage.Work.Tools.IPlugInHost host)
        {
            try
            {
                PlugInHost = host;
                PlugInId = "AddFooterOnFileSaveExcel";
                IExcelPlugInHost wdHost = host as IExcelPlugInHost;
                if (wdHost == null)
                {
                    throw new ArgumentNullException(nameof(wdHost), "Преобразование в IExcelPlugInHost не удалось.");
                }

                wdHost.WorkbookBeforeSave += BeforeSaveTest;

                return true;
            }
            catch (Exception ex)
            {
                WLog.Error($"Произошла ошибка при инициализации: {ex}");
                return false;
            }

        }

        private void BeforeSaveTest(object sender, WOfficeEventArgs e)
        {
            Workbook workbook = e.OfficeDocument as Workbook;
            Worksheet worksheet = workbook.Worksheets.Item[1] as Worksheet;

            var testString = $"Тестирование: {testvalue}";

            worksheet.Cells[1, 1] = testString;
            worksheet.PageSetup.CenterFooter = testString;

            testvalue++;
        }
    }
}

Я также включу пример из документации iManage Work Desktop для Windows SDK Guide версии октября 2022, 10.8.0, ниже. Этот пример показывает, как можно установить нижний колонтитул в документе Word. К сожалению, документации для Excel и PowerPoint нет.

using System;
using iManage.Work.Tools;
using Word = Microsoft.Office.Interop.Word;
namespace Work10OfficePlugins
{
    public class WordPlugIn2 : PlugInBase
    {
        public override bool Initialize(IPlugInHost host)
        {
            PlugInHost = host;
            PlugInId = "myId";
            IWordPlugInHost wordhost = host as IWordPlugInHost;
            
            wordhost.DocumentBeforeSave += this.onDocumentBeforeSave;
            return true;
        }
        private void onDocumentBeforeSave(object sender, WOfficeSaveAsEventArgs e)
        {
            WLog.TraceEnter();
            WLog.Debug("onDocumentBeforeSaveCalled");
            
            var testString = "это тест!";
            
            Word.Document documentBeingSaved = (Word.Document)e.OfficeDocument;
                        documentBeingSaved.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text = stateOfDocument;
            WLog.TraceExit();
        }
    }
}

Я ссылаюсь на Microsoft.Office.Interop.Excel версии 15.0.0.0.

Есть идеи, что я делаю не так? Буду признателен за любую помощь.

Ответ или решение

Для установки значения в нижний колонтитул Excel-документа с использованием библиотеки Microsoft.Office.Interop.Excel в расширении iManage Work, вам следует убедиться, что вы правильно работаете с объектами и событиями. Ваш код, на первый взгляд, выглядит почти корректным, однако есть несколько моментов, которые можно улучшить и уточнить.

Шаги для установки значения в нижний колонтитул

  1. Проверьте, открыт ли документ и активен ли он: Убедитесь, что документ Excel открыт и активен в момент вызова события WorkbookBeforeSave. Это необходимо, чтобы быть уверенным, что вы работаете с правильным экземпляром документа.

  2. Использование правильного объекта для доступа к нижнему колонтитулу: Ваша текущая реализация, использующая worksheet.PageSetup.CenterFooter, в большинстве случаев должна работать, но давайте добавим некоторые проверки и убедимся, что вы используете правильный метод.

  3. Настройка обработки события: Убедитесь, что событие WorkbookBeforeSave правильно обрабатывается и что в вашем обработчике вы фактически задействуете объект Workbook.

Вот окончательный код, который иллюстрирует, как установить значение в нижний колонтитул документа Excel:

using System;
using iManage.Work.Tools;
using Microsoft.Office.Interop.Excel;

namespace iManageExcelPlugin
{
    public class AddFooterOnFileSaveExcel : PlugInBase
    {
        private int testvalue = 1;

        public override bool Initialize(iManage.Work.Tools.IPlugInHost host)
        {
            try
            {
                PlugInHost = host;
                PlugInId = "AddFooterOnFileSaveExcel";

                IExcelPlugInHost excelHost = host as IExcelPlugInHost;
                if (excelHost == null)
                {
                    throw new ArgumentNullException(nameof(excelHost), "Typecast to IExcelPlugInHost failed.");
                }

                excelHost.WorkbookBeforeSave += BeforeSaveTest;

                return true;
            }
            catch (Exception ex)
            {
                WLog.Error($"An error occurred during initialization: {ex}");
                return false;
            }
        }

        private void BeforeSaveTest(object sender, WOfficeEventArgs e)
        {
            // Привязка к рабочей книге
            Workbook workbook = e.OfficeDocument as Workbook;
            if (workbook == null)
            {
                WLog.Error("The specified office document is not a Workbook.");
                return;
            }

            // Получаем доступ к PageSetup нижнего колонтитула
            var testString = $"Testing: {testvalue}";
            workbook.ActiveSheet.PageSetup.CenterFooter = testString;

            // Если необходимо, выводим в ячейку как дополнительное подтверждение
            Worksheet worksheet = workbook.Worksheets.Item[1] as Worksheet;
            if (worksheet != null)
            {
                worksheet.Cells[1, 1] = testString;
            }

            testvalue++;
        }
    }
}

Объяснение изменений:

  1. Проверка Workbook: Проверяем, действительно ли e.OfficeDocument — это Workbook. Это поможет избежать ошибок, если документ не Excel.

  2. Использование ActiveSheet: Мы устанавливаем значение в CenterFooter непосредственно на активном листе рабочего документа, что должно обеспечить корректное срабатывание.

  3. Логирование ошибок: Добавлены логи для лучшего понимания работы вашего кода и предотвращения неожиданных исключений.

Итог

После внесения вышеуказанных изменений вы должны иметь возможность установить значение нижнего колонтитула в Excel-документе. Если проблема сохраняется, стоит еще раз проверить окружение и убедиться, что все библиотеки и компоненты iManage Work корректно интегрированы.

Оцените материал
Добавить комментарий

Капча загружается...