同一行的Excel单元格报告不同的顶部位置
本文关键字:报告 顶部 位置 单元格 Excel 一行 | 更新日期: 2023-09-27 18:18:27
我正在用c#编程地构建一个Excel电子表格(快乐!),我在范围内看到奇怪的行为。前财产。
我正在构建一个网络图(请不要问我为什么使用Excel,但要知道这不是我的决定,它不能改变),所以许多单元格(节点)是通过使用Worksheet.Shapes.addLine(...)
绘制的线(弧)连接的。不幸的是,我的许多弧不能很好地与我的节点连接。
每次我向图中添加一个节点(通过用节点ID填充单元格的值)时,我都会查询它的位置,以便我可以计算它的中心并将其用作线锚点。
在调试时看到的一个示例中,我添加了两个节点,1在单元C3, 2在E3。对于每个单元格,Range。顶部属性给出了不同的数字!
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
我已经阅读了手册,测量是到行顶部,与它的内容没有任何关系,所以我看不出为什么属性应该在这里改变。
我对这个问题很恼火,我现在要先遍历所有必需的列和行来创建坐标字典,而不是在使用时查询单元格的位置,这样至少如果它们错了,它们都以同样的方式错了。
有没有哪个Excel高手能解释一下这个奇怪的结果,或者告诉我是哪里出了问题?多谢。
编辑:应该提到- .NET v4, Microsoft.Office.Interop.Excel v11我试图通过在各种单元格上按下键运行以下代码来模拟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
只报告第一个单元格的高度。
不是答案,但可能是你下一步的灵感