C# Excel VSTO调用v2003和v2007之间不同的结果-为什么?

C# Excel VSTO调用v2003和v2007之间不同的结果-为什么?,c#,vsto,excel-2007,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.For

我的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);
当我在Excel2003中运行它时,它工作得非常好。但是,当我在Excel2007中运行它时,形状的最大值已关闭。。。它总是在预定位置上方的几个像素处结束

当我查看日志时,在Excel2003中形状始终放置在正确的位置,但在Excel2007中,当代码尝试放置形状的顶部位置时,Excel2007似乎出于某种原因覆盖了该值

例如,在一种情况下,leafPoint.Top值解析为206.25。在Excel2003中,这确实是结果。但是,在Excel2007中,该值最终变为204.2954

有人对这个问题有所了解吗?

是.Duplicate函数实现了这一点。它不复制相同的。顶部或。左侧。我猜这一变化是由于客户反馈无法找到重复的形状,您可以手动复制,也可以选择形状并单击Ctrl+D

你只需将它们发送到原始形状的顶部和左侧。以下是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

我终于明白了。基于此链接,它在修复的bug中提到:

属性的Top属性的值 线对象受缩放级别的影响。 这会导致错误的位置 设置此值时的线型 以编程方式创建图纸上的行 它被缩放到除 百分之百

我想如果线条对象受到影响,形状对象可能也会有问题吗

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

另请注意:此问题仅在渲染期间发生。绘制完所有形状后,我可以将缩放级别设置为我想要的任何级别,并且形状可以正确定位


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

但我正在手动设置顶部。。。!在最后一行,我设置了Top属性…这是一个POCO,不是一个形状,no.POCO=普通的旧CLR对象;项目是他为应用程序创建的对象之一,而不是本机Excel对象。不确定这是否相关,但本文讨论了2003年和2007年之间的一些更改,其中一个更改区域是形状。特别是,2003年和2007年创建的形状似乎不一定相同。