Исключение плагина VSTO для Excel 2007 при настройке Font.Color - PullRequest
3 голосов
/ 26 марта 2010

Я работаю над плагином VSTO для Excel 2007, который генерирует исключения COM на клиенте, но не при отладке на моем компьютере разработчика.

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

private void ThisWorkbook_Startup(object sender, System.EventArgs e)
        {
            this.BeforeSave += new Microsoft.Office.Interop.Excel.WorkbookEvents_BeforeSaveEventHandler(ThisWorkbook_BeforeSave);

            this.SheetChange += new Microsoft.Office.Interop.Excel.WorkbookEvents_SheetChangeEventHandler(ThisWorkbook_SheetChange);

            cfStyle = Globals.ThisWorkbook.Styles.Add("CFStyle", missing);
            cfStyle.Font.Color = Excel.XlRgbColor.rgbOrange;
            cfStyle.Font.Bold = true;
            cfStyle.Interior.Color = Excel.XlRgbColor.rgbLightGray;
            cfStyle.Interior.TintAndShade = 0.8;

            cfStyle.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
            cfStyle.Borders.Weight = Excel.XlBorderWeight.xlThin;
            cfStyle.Borders.Color = Excel.XlRgbColor.rgbDarkSlateGray;
            cfStyle.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlDiagonalDown].LineStyle = Excel.XlLineStyle.xlLineStyleNone;
            cfStyle.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlDiagonalUp].LineStyle = Excel.XlLineStyle.xlLineStyleNone;
        }

Когда это работает в dev, это работает отлично. Однако, когда он запускается на клиентском компьютере, я получаю эту информацию об исключении после загрузки плагина VSTO. Интересно, что при первом COM-взаимодействии происходит сбой, в результате чего устанавливается свойство Style.Font.Color.

Вот подробности исключения:

System.Runtime.InteropServices.COMException (0x800A03EC): исключение из HRESULT: 0x800A03EC

Трассировка стека серверов:

Исключение переброшено в [0]:

в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (Шеззаде reqMsg, IMessage retMsg)

в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32)

в Microsoft.Office.Interop.Excel.Font.set_Color (Объект ) * * Тысяча двадцать-один

в TriQuint.DemandPlanning.Workbook.ThisWorkbook.ThisWorkbook_Startup (Объект отправитель, EventArgs e)

в Microsoft.Office.Tools.Excel.Workbook.OnStartup ()

в TriQuint.DemandPlanning.Workbook.ThisWorkbook.FinishInitialization ()

в Microsoft.VisualStudio.Tools.Office.EntryPointComponentBase.Microsoft.VisualStudio.Tools.Applications.Runtime.IEntryPoint.FinishInitialization ()

в Microsoft.VisualStudio.Tools.Applications.AddInAdapter.ExecutePhase (ExecutionPhases executionPhases)

в Microsoft.VisualStudio.Tools.Applications.AddInAdapter.CompleteInitialization ()

в Microsoft.VisualStudio.Tools.Office.Internal.OfficeAddInAdapterBase.ExecuteEntryPointsHelper ()

Кто-нибудь когда-нибудь видел что-нибудь подобное? Я сделал довольно много проверок, таких как обеспечение правильных версий .NET, VSTO Interop, Excel 2007 и т. Д. И т. Д.

Заранее спасибо за любой совет! Jim

Ответы [ 2 ]

1 голос
/ 27 марта 2010

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

Итак, чтобы переформулировать желаемую функциональность: цель состоит в том, чтобы изменять стиль ячейки (фон, шрифт, границы и т. Д.) Всякий раз, когда пользователь редактирует ячейку.

Вот код, который делает трюк:

void ThisWorkbook_SheetChange(object Sh, Microsoft.Office.Interop.Excel.Range Target)
        {
            foreach (Excel.Range range in Target.Cells)
            {
                Excel.Range cellRange = range.Cells[1, 1] as Excel.Range;

                cellRange.Borders.ColorIndex = 10;
                cellRange.Interior.ColorIndex = 43;
                cellRange.Font.Bold = true;
            }
        }

ThisWorkbook_SheetChange - это обработчик события Workbook.SheetChange. Просто установите свойства стиля, которые существуют в объекте Range. НЕ устанавливайте свойства стиля для объекта Range.Style. Если вы это сделаете, это изменит стиль по умолчанию в Excel и приведет к изменению всех ваших ячеек, использующих этот стиль.

Я полагаю, что написание этого текста также будет работать, но я не проверял это:

void ThisWorkbook_SheetChange(object Sh, Microsoft.Office.Interop.Excel.Range Target)
            {
                Target.Cells.Borders.ColorIndex = 10;
                Target.Cells.Interior.ColorIndex = 43;
                Target.Cells.Font.Bold = true;
            }

Спасибо code4life за ваш пост о ColorIndex. Ваша информация очень помогла.

0 голосов
/ 26 марта 2010

Вы получаете 56-цветную палитру в Excel для игры. Цветовая палитра будет отличаться от одного рабочего стола к другому, особенно если вы не используете пользовательский шаблон для создания своих рабочих листов (шаблоны могут распространяться с компьютера на компьютер, что позволяет настраивать 56 цветов на одном компьютере и сохранять их). к шаблону, и общие между машинами). Вместо того, чтобы устанавливать свойство Font.Color, установите Font.ColorIndex в число в этом диапазоне. Это должно исключить возникшее исключение. Тем не менее, это, вероятно, раскроет следующую проблему: цветовая палитра между клиентскими компьютерами и вашим рабочим столом различна Чтобы решить эту проблему, вам нужно переопределить цветовую палитру по умолчанию, чтобы соответствовать тому, что на вашем рабочем столе.

...