我在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
...
有没有人对此问题有所了解?
答案 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%。完成所有绘图后,您可以将缩放级别设置回原始所需的缩放。