Результаты вызовов Excel VSTO отличаются между v2003 и v2007 - почему? - PullRequest
0 голосов
/ 05 августа 2010

У меня есть этот кусок кода c # в моей надстройке Excel 2003:

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, по-моему, переопределяет значение по какой-то причине (я думаю).case значение leafPoint.Top разрешено до 206.25.В Excel 2003 это действительно был результат.Однако в Excel 2007 это значение в конечном итоге становится 204.2954 ...

Кто-нибудь имеет некоторое представление об этой проблеме?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

Я наконец понял это.На основании этой ссылки Excel 2007 Service Pack 2 - официальный список исправлений , он упоминает среди исправленных ошибок:

На значение свойства Top объекта Line влияетУровень масштабирования.Это приводит к неправильному расположению фигур линий, когда это значение программно установлено для линий на листе, масштаб которых превышает любое значение, кроме 100%.

Я подумал, что если на объект «Линия» это повлияло, возможно, это можетБыли ли проблемы с объектом Shape?

Итак, я проверил свой шаблон, и действительно, он был установлен на 80%.(Между прочим, линейные объекты работают нормально, поскольку в моей версии Excel установлен SP2).Как только я установил уровень масштабирования на 100%, объекты-фигуры неожиданно оказались в том положении, в котором они ожидались.

Еще одно примечание: эта проблема возникает только во время рендеринг.После того, как все фигуры нарисованы, я могу установить желаемый уровень масштабирования и правильно расположить фигуры.

Вывод: при рисовании фигур в Excel, всегда установите уровень масштабирования на 100%.После завершения рисования вы можете установить уровень масштабирования обратно на исходный требуемый масштаб.

0 голосов
/ 05 августа 2010

Это функция .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
...