Вопрос или проблема
Я разрабатываю настольное расширение для 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, вам следует убедиться, что вы правильно работаете с объектами и событиями. Ваш код, на первый взгляд, выглядит почти корректным, однако есть несколько моментов, которые можно улучшить и уточнить.
Шаги для установки значения в нижний колонтитул
-
Проверьте, открыт ли документ и активен ли он: Убедитесь, что документ Excel открыт и активен в момент вызова события
WorkbookBeforeSave
. Это необходимо, чтобы быть уверенным, что вы работаете с правильным экземпляром документа. -
Использование правильного объекта для доступа к нижнему колонтитулу: Ваша текущая реализация, использующая
worksheet.PageSetup.CenterFooter
, в большинстве случаев должна работать, но давайте добавим некоторые проверки и убедимся, что вы используете правильный метод. -
Настройка обработки события: Убедитесь, что событие
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++;
}
}
}
Объяснение изменений:
-
Проверка
Workbook
: Проверяем, действительно лиe.OfficeDocument
— этоWorkbook
. Это поможет избежать ошибок, если документ не Excel. -
Использование
ActiveSheet
: Мы устанавливаем значение вCenterFooter
непосредственно на активном листе рабочего документа, что должно обеспечить корректное срабатывание. -
Логирование ошибок: Добавлены логи для лучшего понимания работы вашего кода и предотвращения неожиданных исключений.
Итог
После внесения вышеуказанных изменений вы должны иметь возможность установить значение нижнего колонтитула в Excel-документе. Если проблема сохраняется, стоит еще раз проверить окружение и убедиться, что все библиотеки и компоненты iManage Work корректно интегрированы.