我正在用C#以编程方式构建一个Excel电子表格(joy!)我在Range.Top属性中看到了奇怪的行为。
我正在构建一个网络图(请不要问我为什么要使用Excel,但要知道这不是我的决定,它不能改变)如此多的单元格(节点)是由使用Worksheet.Shapes.addLine(...)
绘制的直线(圆弧)连接的。不幸的是,我的许多弧不能很好地与我的节点连接起来。
每次我向图中添加一个节点(通过用节点ID填充单元格的值)时,我都会查询它的位置,以便我可以计算它的中心并将其用作线锚点。
在我调试时看到的一个示例中,我添加了两个节点,一个在单元C3上,两个在E3上。对于每个单元格,Range.Top属性会给出一个不同的数字!
Range cell = ws.Cells[3, 3]; // y (rows) before x (cols)
node.renderSmallerX = Convert.ToDouble(cell.Left); // e.g. 100
node.renderSmallerY = Convert.ToDouble(cell.Top); // e.g. 100
node.renderLargerX = node.renderSmallerX + Convert.ToDouble(cell.Width); // e.g. 130
node.renderLargerY = node.renderSmallerY + Convert.ToDouble(cell.Height); // e.g. 115
// ... (next loop)
Range cell = ws.Cells[3, 5];
node.renderSmallerX = Convert.ToDouble(cell.Left); // e.g. 100
node.renderSmallerY = Convert.ToDouble(cell.Top); // e.g. 114.25
node.renderLargerX = node.renderSmallerX + Convert.ToDouble(cell.Width); // e.g. 130
node.renderLargerY = node.renderSmallerY + Convert.ToDouble(cell.Height); // e.g. 129.25
我已经阅读了the manual,度量位于行的顶部,并且与其内容没有任何关系,因此我认为没有理由在这里更改该属性。
我对这个问题非常恼火,现在我将首先迭代所有需要的列和行来创建坐标字典,而不是在使用时查询单元格的位置,这样至少即使它们是错的,它们也都是以同样的方式出错的。
有没有Excel专家可以解释这个非常奇怪的结果,或者告诉我问题出在哪里?非常感谢。
编辑:应该提到- .NET v4,Microsoft.Office.Interop.Excel v11
发布于 2011-12-19 10:47:25
我试图在Excel2003中模拟您的问题,方法是在不同的单元格上按键运行以下代码
Sub GetCoord()
Dim R1 As Range, R2 As Range
Set R1 = Selection
Set R2 = Selection.Cells(1, 1)
MsgBox "T/L/W/H:" & vbCrLf & _
R1.Top & "/" & R1.Left & "/" & R1.Width & "/" & R1.Height & vbCrLf & _
R2.Top & "/" & R2.Left & "/" & R2.Width & "/" & R2.Height
End Sub
我没有发现同一行中的单元格的.Top
是不同的,尽管我在不同线条粗细的范围内试验了.VerticalAlignment
和be。
随着至少一个电池上的不同线条厚度,.Top
会发生变化-但对两个电池来说是同步的。对于两个单元格,如果线条粗细不同,则两个.Top
都使用较粗的线条。
在我的MsgBox
中,可以看到R1和R2在合并单元格中的另一个不同之处:R1.Height
报告总高度,而R2.Height
只报告第一个单元格的高度。
这不是一个答案,但可能会启发你下一步该往哪里看。
https://stackoverflow.com/questions/8557945
复制相似问题