如何从VSTO代码创建带边框的样式?

时间:2015-05-13 09:18:11

标签: c# excel vsto

我正在使用VSTO在C#中开发Excel插件。在这个插件中,我创建了一些样式并将它们添加到当前工作簿中。一切正常,直到我尝试在我的风格上设置一些边框。

这是我使用的代码:

var style = workbook.styles.Add("My style");

style.IncludeAlignment = false;
style.IncludeFont = false;
style.IncludeNumber = false;
style.IncludeProtection = false;
style.IncludePatterns = false;

style.IncludeBorder = true;
foreach (XlBordersIndex borderIndex in new[] { 
                XlBordersIndex.xlEdgeLeft, 
                XlBordersIndex.xlEdgeRight, 
                XlBordersIndex.xlEdgeTop, 
                XlBordersIndex.xlEdgeBottom })
{
    style.Borders[borderIndex].LineStyle = XlLineStyle.xlContinuous;
}

我希望这段代码能够创建一个设置了四个边框的样式,但似乎只设置了左边缘(我可以通过在循环后查看调试器中的样式对象,并在Excel中看到它)编辑"我的风格")。

我尝试录制一个VBA宏来查看Excel生成的代码,我得到了这个:

ActiveWorkbook.Styles.Add Name:="My style"
With ActiveWorkbook.Styles("My style")
    .IncludeNumber = False
    .IncludeFont = False
    .IncludeAlignment = False
    .IncludeBorder = True
    .IncludePatterns = False
    .IncludeProtection = False
End With
With ActiveWorkbook.Styles("My style").Borders(xlLeft)
    .LineStyle = xlContinuous
    .TintAndShade = 0
    .Weight = xlThin
End With
With ActiveWorkbook.Styles("My style").Borders(xlRight)
    .LineStyle = xlContinuous
    .TintAndShade = 0
    .Weight = xlThin
End With
With ActiveWorkbook.Styles("My style").Borders(xlTop)
    .LineStyle = xlContinuous
    .TintAndShade = 0
    .Weight = xlThin
End With
With ActiveWorkbook.Styles("My style").Borders(xlBottom)
    .LineStyle = xlContinuous
    .TintAndShade = 0
    .Weight = xlThin
End With

此宏按预期工作。我注意到它使用xlTopxlLeft等代替xlEdgeTopxlEdgeLeft,但我无法找到有关这些常量的任何文档,但它们不是可在VSTO枚举XlBordersIndex中找到。从我发现的情况来看,似乎后者代表范围的边缘,而前者代表每个细胞的边缘,但我不确定这一点,我认为这种差异在谈论时没有多大意义样式,适用于单个细胞AFAICT。

为什么我的C#addin和这个VBA宏之间有不同的行为?如何从我的VSTO代码创建带边框的样式?

1 个答案:

答案 0 :(得分:1)

根据this discussion,似乎样式的边框与范围的边界之间存在差异:后者由XlBordersIndex编入索引(xlEdgeTop,{{ 1}},...),如the documentation中所述,但前者由ConstantsxlEdgeLeftxlTop,...)编制索引。

如果我们认为某个样式适用于单个单元格而不是某个范围,这是有意义的,但这也意味着要访问样式边框,我们必须使用不相关的常量绕过xlLeft接口的界面。 AnushRudaa here提出的这种解决方法似乎有效:

Borders