设置 Font.Color 时 Excel 2007 VSTO 插件异常

Posted

技术标签:

【中文标题】设置 Font.Color 时 Excel 2007 VSTO 插件异常【英文标题】:Excel 2007 VSTO plugin exception when setting Font.Color 【发布时间】:2010-03-26 00:55:57 【问题描述】:

我正在开发一个 Excel 2007 VSTO 插件,该插件在客户端上引发 COM 异常,但在我的开发机器上调试时却没有。

插件的作用是捕获 Excel 的 Startup 事件,定义专门的样式,然后将事件处理程序添加到 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(IMessage reqMsg, IMessage retMsg)

在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& 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 执行阶段)

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

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

有人见过这样的吗?我已经做了很多验证,例如确保 .NET、VSTO Interop、Excel 2007 等的正确版本。

提前感谢您的任何建议! 吉姆

【问题讨论】:

【参考方案1】:

为了有可能让其他人免于浪费很多时间的痛苦,我想我会发布我的解决方案。它非常简单,让我重新思考我作为开发人员的生活。好吧,不是真的,但仍然......

因此,重新声明所需的功能:目标是在用户编辑单元格时更改单元格的样式(背景、字体、边框等)。

下面是解决问题的代码:

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 的帖子。你的信息帮了大忙。

【讨论】:

【参考方案2】:

您可以在 Excel 中使用 56 色调色板。调色板会因桌面而异,特别是如果您不使用自定义模板作为工作表的基础(模板可以从计算机分发到计算机,从而允许在一台机器上自定义 56 种颜色,存储到模板,并共享 btw 机器)。不要设置 Font.Color 属性,而是将 Font.ColorIndex 设置为此范围内的数字。那应该消除抛出的异常。但是,这可能会发现下一个问题,即客户端计算机和您的桌面的调色板不同。要解决此问题,您需要覆盖默认调色板以匹配桌面上的颜色。

【讨论】:

感谢您的回复。这次使用 Font.ColorIndex 会从 ColorIndex 设置器中引发相同的异常。我猜这是因为您引用的第二个问题。不过,我不完全确定如何覆盖调色板。我发现的另一个问题是该插件适用于一张空白纸。如果生成了工作表(我正在使用 Aspose.Cells),则会引发异常。

以上是关于设置 Font.Color 时 Excel 2007 VSTO 插件异常的主要内容,如果未能解决你的问题,请参考以下文章

文字排版--字号颜色(font-size, color)

python对Excel单元格加颜色

python对Excel单元格加颜色

python对Excel单元格加颜色

python对Excel单元格加颜色

html中改变字体颜色的代码怎么写