我正在用C#编写Excel电子表格(欢乐!),我在Range.Top属性中看到奇怪的行为。
我正在构建一个网络图(请不要问我为什么使用Excel,但要知道这不是我的决定而且它无法改变)所以很多单元(节点)都通过线连接(弧形) )使用Worksheet.Shapes.addLine(...)
绘制的。不幸的是,我的很多弧线都没有与我的节点很好地结合在一起。
每次我向图中添加一个节点(通过用节点ID填充单元格的值),我查询它的位置,以便我可以计算它的中心并将其用作线锚点。
在一个例子中,我看到在调试时我添加了两个节点,1个在C3单元,2个在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答案 0 :(得分:2)
我尝试通过在各个单元格的按键上运行以下代码来模拟Excel 2003中的问题
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
进行了实验,并且在具有各种线条粗细的范围内使用了框。
对于至少一个单元格中的各种线条厚度.Top
会发生变化 - 但两个单元格同步。对于两个单元格的线宽不同,.Top
都与较粗的线一致。
对于合并的单元格,我的MsgBox
中的R1和R2之间会有另外一个区别:R1.Height
报告总高度,而R2.Height
仅报告第一个单元格的高度。
不是答案,但也许是你的灵感,在哪里看下一步。