Excel VSTO调用结果在v2003和v2007之间有所不同 - 为什么?

时间:2010-08-05 17:49:30

标签: c# vsto excel-2007

我在Excel 2003加载项中有这段c#代码:

var leafPoint = m_worksheet.Shapes.Item("aPoint").Duplicate();

leafPoint.Name = "Shape" + (m_shapesNameIndex++).ToString();
leafPoint.OnAction = m_worksheet.CodeName + ".PointClicked";
leafPoint.AlternativeText = 

string.Format("Correlation Value: {0}",     
    item.PointData.Correlation.ToString("0.0000;-0.0000"));

leafPoint.Top = item.LeftChildNode.Top + 
    ((item.RightChildNode.Top - item.LeftChildNode.Top) / 2) + 
    (leafPoint.Height / 2);

当我在Excel 2003中运行它时,它完美地运行。但是,当我在Excel 2007中运行它时,形状的Top值关闭...它总是在预定位置上方几个像素!

当我查看日志时,在Excel 2003中,形状始终位于正确的位置,但在Excel 2007中,当代码尝试放置形状的顶部位置时,Excel 2007似乎由于某种原因覆盖了值(我想)。

例如,在一种情况下,leafPoint.Top值已解析为206.25。在Excel 2003中,确实是结果。但是,在Excel 2007中,此值最终变为204.2954 ...

有没有人对此问题有所了解?

2 个答案:

答案 0 :(得分:0)

执行此操作的.Duplicate函数。它不会复制相同的.Top.Left。我猜这个变化是客户反馈无法找到重复形状的结果(你可以手动复制,也可以选择形状,然后点击 Ctrl + D

您可以将它们发送到原始形状的.Top.Left。 。这是VBA中的一个例子:

Sub AddShapeAndDuplicate()
    Dim sh As Shape
    Set mysheet = Worksheets(1)
    With mysheet.Shapes
    Set sh = .AddShape(msoShapeRectangle, 144, 144, 72, 72)
        With sh
            .Name = "Red Square"
            .Fill.ForeColor.RGB = RGB(255, 0, 0)
        End With
    End With

    Dim sh2 As Shape
    Set sh2 = sh.Duplicate
    With sh2
        .Top = sh.Top
        .Left = sh.Left
    End With
End Sub

答案 1 :(得分:0)

我终于明白了。根据此链接Excel 2007 Service Pack 2 – the official fix list,它会在修复的错误中提及:

  

的Top属性的值   线对象受缩放级别的影响。   这会导致错误的放置   设置此值时的线形   以编程方式在工作表上的行   它被缩放到除了之外的任何东西   100%。

我认为Line对象是否受到影响,也可能是Shape对象出现了问题?

所以我检查了我的模板,实际上,它被设置为80%。 (顺便说一句,行对象工作正常,因为我的Excel版本安装了SP2)。只要我将缩放级别设置为100%,形状对象就会突然渲染到预期的位置。

另一个注意事项:此问题仅在呈现期间发生。绘制完所有形状后,我可以将缩放级别设置为我想要的,并且形状可以正确定位。

结论:每当在Excel中绘制形状时,始终将缩放级别设置为100%。完成所有绘图后,您可以将缩放级别设置回原始所需的缩放。