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

在C#或VBA中以编程方式将Jpeg图像插入Visio绘图,c#,vba,import,visio,C#,Vba,Import,Visio,有没有办法使用C#或VBA将jpeg图像插入visio? 插入后,是否有方法格式化要放置在图形上的宽度、高度、位置等属性?将图像导入Visio时,图像将被包装成标准形状(类型属性为visTypeForeignObject) 从那里你只需要和形状表中的细胞对话。(有关ShapeSheet的更多详细信息,请参阅本文) 因此,您可以从使用Visio上的宏录制器开始执行这类操作。将图像拖到页面上会产生如下输出: Sub Macro1() 'Enable diagram services

有没有办法使用C#或VBA将jpeg图像插入visio?
插入后,是否有方法格式化要放置在图形上的宽度、高度、位置等属性?

将图像导入Visio时,图像将被包装成标准形状(类型属性为visTypeForeignObject)

从那里你只需要和形状表中的细胞对话。(有关ShapeSheet的更多详细信息,请参阅本文)

因此,您可以从使用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
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
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";
    }
}
宏录制器根据当前选择进行操作,但您不需要这样做。此外,它使用SRC(节、行、列)语法,而不是更简单的单元名语法。所以上面的翻译可能是这样的:

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
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
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";
    }
}
这个的C#版本如下所示:

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
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
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一起使用的扩展方法:


…但如何获得应用程序对象取决于您自己。

John,太好了,它工作得非常好。但是是否有内置的东西可以将形状放置在页面的末尾,比如shpNew.cellsu.end?或者我需要运行一个宏来找到您在“sub Macro1”中显示的坐标吗?为此,您需要向PinX/Y单元格添加一个公式,而不是一个常量值。对于PinX:
“页面!页面宽度-(宽度LocPinX)”
和对于PinY
“页面!页面高度-(高度LocPinY)”
。这会将形状设置在页面的左上角。对不起,我的问题是将其放置在页面底部,我相信使用+修改公式会将形状设置在页面底部,不是吗?Hi@Puneeth,不,不会,这会将其放置在页面上方。Visio的坐标系原点是基于左下角的,因此,如果要从底部对齐形状,则不需要页面高度参考,将PinY设置为
“height LocPinY”
应该会得到正确的结果。尝试在ShapeSheet中手动执行此操作以查看结果。此区域的一些有用链接可能是和Hi-Puneeth-我知道您想要底部的形状,这就是为什么我建议将PinY设置为
“Height LocPinY”
。如果您还想考虑页边距,那么它将是
“Height LocPinY+page!PageBottomMargin”
。如果“边框”是指位于中心线两侧的形状线宽,则可以尝试
“Height LocPinY+(LineWeight/2)”
。这完全是一个根据你的需要改变配方的例子。右键单击页面可查看页面的ShapeSheet和可引用的各种单元格。如果我没有抓住要点,那就添加一个关于公式的新问题。