在 C# 或 VBA 中以编程方式将 Jpeg 图像插入到 Visio 绘图中

Inserting Jpeg image onto Visio drawing programmatically in C# or VBA

有没有办法使用 C# 或 VBA 将 jpeg 图像插入到 visio 中? 插入后有没有办法格式化它的属性,如宽度、高度、放置在绘图上的位置?

将图像导入 Visio 后,它们会被包裹成标准形状(类型 属性 为 visTypeForeignObject)。

从那里您只是在与 ShapeSheet 中的单元格对话。 (有关 ShapeSheet http://visualsignals.typepad.co.uk/vislog/2007/10/just-for-starte.html 的更多详细信息,请参阅此 post)

因此,您可以先使用 Visio 上的宏录制器来处理这类事情。将图像拖到页面上将产生如下输出:

Sub Macro1()

    'Enable diagram services
    Dim DiagramServices As Integer
    DiagramServices = ActiveDocument.DiagramServicesEnabled
    ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150

    Dim UndoScopeID2 As Long
    UndoScopeID2 = Application.BeginUndoScope("Auto Size Page")
    Application.ActiveWindow.Page.AutoSize = False
    Application.EndUndoScope UndoScopeID2, True

    Dim UndoScopeID3 As Long
    UndoScopeID3 = Application.BeginUndoScope("Insert")
    Application.ActiveWindow.Page.Import "C:\SomeImage.jpg"
    Application.EndUndoScope UndoScopeID3, True

    ActiveWindow.DeselectAll
    ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(1), visSelect
    Application.ActiveWindow.Selection.Move 2.129396, -0.904364

    Dim UndoScopeID4 As Long
    UndoScopeID4 = Application.BeginUndoScope("Size Object")
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm"
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "212.02916285428 mm"
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "103.47666530807 mm"
    Application.EndUndoScope UndoScopeID4, True

    Dim UndoScopeID5 As Long
    UndoScopeID5 = Application.BeginUndoScope("Size Object")
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "46.261665987369 mm"
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "185.77916321819 mm"
    Application.ActiveWindow.Page.Shapes.ItemFromID(1).CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "73.441667394486 mm"
    Application.EndUndoScope UndoScopeID5, True

    'Restore diagram services
    ActiveDocument.DiagramServicesEnabled = DiagramServices

End Sub

宏录制器根据当前选择操作,但您不需要。此外,它使用 SRC(Section、Row、Column)语法而不是更简单的单元格名称语法。所以上面的翻译可能是这样的:

Sub TestAddImage()
    Call DropImage(ActivePage, "C:\SomeImage.jpg")
End Sub

Private Sub DropImage(ByRef vPag As Visio.Page, imageFile As String)

If Not vPag Is Nothing Then
    Dim newShp As Visio.Shape
    Set shpNew = vPag.Import(imageFile)
    'Set position
    shpNew.CellsU("PinX").FormulaU = "75mm"
    shpNew.CellsU("PinY").FormulaU = "175mm"
    'Set size
    shpNew.CellsU("Width").FormulaU = "100mm"
    shpNew.CellsU("Height").FormulaU = "80mm"
End If

End Sub

C# 版本看起来像这样:

void Main()
{
    var vApp = MyExtensions.GetRunningVisio();
    DropImage(vApp.ActivePage, @"C:\SomeImage.jpg");
}

private void DropImage(Visio.Page vPag, string imageFile)
{
    if (vPag != null)
    {
        var shpNew = vPag.Import(imageFile);
        //Set position
        shpNew.CellsU["PinX"].FormulaU = "75mm";
        shpNew.CellsU["PinY"].FormulaU = "175mm";
        //Set size
        shpNew.CellsU["Width"].FormulaU = "100mm";
        shpNew.CellsU["Height"].FormulaU = "80mm";
    }
}

请注意,GetRunningVisio 是我与 LinqPad 一起使用的扩展方法:

http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html

...但是如何获取应用程序对象取决于您。