Excel Interop перемещение / настройка местоположения изображения - PullRequest
2 голосов
/ 08 августа 2011

Мы экспортируем набор данных, используя .net interop, в Excel, и наш файл шаблона содержит несколько изображений.

В зависимости от количества экспортируемых столбцов мы хотим разместить изображение на X пикселей слева.последнего столбца в зависимости от размера / ширины изображения.Используя запись, макро-функция, перемещающая изображение, является «без операции».Установка позиции Shape.Left также не будет работать.

Вопрос

Как позиционировать изображение в excel, используя X-пиксели взаимодействия между ячейкой илификсированная позиция X / Y на экране, где X / Y - это положения пикселей относительно ячейки.

Это не сработало

Dim pixels As Integer = 40
Dim cell As Excel.Range = ws.Cells(10, 10)
s.Left = s.Left - 100

The 'решение '

После некоторой отладки мы заметили, что это не работает в моей офисной версии.Обновление моей офисной версии до 2010 сделало приведенный выше пример снова.Мы добавили еще один PictureShape вместо Office 2007, исправляя наши собственные проблемы.

Ответы [ 3 ]

3 голосов
/ 11 августа 2011

Вы уверены, что Shape.Left не будет работать? Если все сделано правильно, все работает нормально. Попробуйте это так (C #):

//This assumes shape is already assigned to the shape you want to move
//and ws is assigned to the worksheet
//set cell to whatever cell you want to move the image to
Excel.Range cell = ws.Cells[10, 10];
int pixels = 40; //Number of extra pixels over from the left edge of the cell
shape.Left = ((float)cell.Left + pixels);
shape.Top = ((float)cell.Top);

Для VB это должно быть что-то вроде ниже, но я не эксперт VB

Dim pixels As Integer = 40
Dim cell As Excel.Range = ws.Cells(10, 10)
s.Left = (CSng(cell.Left) + pixels) 'Note: if using cell.Left you must cast as single
s.Top = CSng(cell.Top)

Редактировать: я только что создал тестовую программу в VB. Следующий код действительно перемещает мои изображения.

    Dim oXL As Excel.Application
    Dim oWB As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim oRng As Excel.Range
    Dim oShape As Excel.Shape

    ' Start Excel and get Application object.
    oXL = CreateObject("Excel.Application")
    oXL.Visible = True

    ' Get a new workbook.
    oWB = oXL.Workbooks.Open("*insert_valid_path_here*")
    oSheet = oWB.ActiveSheet
    For Each oShape In oSheet.Shapes
        oShape.Left = oShape.Left + 9000
    Next

    ' Make sure Excel is visible and give the user control
    ' of Excel's lifetime.
    oXL.Visible = True
    oXL.UserControl = True

    ' Make sure that you release object references.
    oRng = Nothing
    oSheet = Nothing
    oWB = Nothing
    oXL.Quit()
    oXL = Nothing

Я подозреваю, что вы либо неправильно назначаете фигуру, либо ожидаете, что она будет в неправильном месте, либо неправильно сохраняете.

1 голос
/ 09 апреля 2015

Несколько методов Office 2013 изменили свое поведение, возвращая объекты ShapeRange, противоположные только объекту Shape.

Возможно, вы получаете ошибку, потому что объект ShapeRange не имеет свойства left (или top, right и так далее). Вы должны подтвердить это в отладчике.

Хотя это немного грязно, вы можете написать что-то вроде этого, чтобы ваш код был совместим для обеих версий:

If TypeName(pic) = "ShapeRange" Then
        Set pic = pic(1)
End If

Это будет тянуть объект, который вы ищете в 2013 году и будет игнорироваться в 2010 году.

...