将Excel范围导出为图像(VB.NET)

时间:2012-05-23 15:12:22

标签: vb.net excel vba charts

我有一个正在运行的excel vba宏,可以从here执行我想要的操作,并且我正在尝试将其转换为VB.NET。

VBA的代码:

Sub bah()
''' Set Range you want to export to file
    Dim rgExp As Range: Set rgExp = Range("B2:C6")
    ''' Copy range as picture onto Clipboard
    rgExp.CopyPicture Appearance:=xlScreen, format:=xlBitmap
    ''' Create an empty chart with exact size of range copied
    With ActiveSheet.ChartObjects.Add(Left:=rgExp.Left, Top:=rgExp.Top, _
    Width:=rgExp.Width, Height:=rgExp.Height)
    .Name = "ChartVolumeMetricsDevEXPORT"
    .Activate
    End With
    ''' Paste into chart area, export to file, delete chart.
    ActiveChart.Paste
   ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Chart.Export "C:\Users\ajohnson\Desktop\workdamnit.jpg"
ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Delete
End Sub

这样做是采用excel范围,然后将其放入图表中,该图表是该范围的副本并将其另存为JPG。

这是我最近尝试制作VB.NET:

Dim xlApp As New Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
Dim xlRange As Excel.Range
xlWorkBook = xlApp.Workbooks.Open("C:\test.xlsx")
xlWorkSheet = xlWorkBook.Sheets("Sheet1")


 xlRange = xlWorkSheet.Range("B2:C6")
        With xlWorkSheet.ChartObjects.add(xlRange.Left, xlRange.Top, xlRange.Width, xlRange.Height)
            .name = "Chart1"
            .activate()
        End With
xlWorkSheet.ChartObjects("Chart1").Paste()
        xlWorkSheet.ChartObjects("Chart1").chart.export(Filename:="C:\Users\ajohnson\Desktop\saveit.jpg")
        xlWorkSheet.ChartObjects("Chart1").delete()

我在转换ActiveChart.Paste方法时遇到了麻烦。我不能让它在VB.NET中工作。它会抛出一个错误,或者当我在VB.NET中执行它时只留下一个空框(如果我在运行粘贴之前添加.chart,但不粘贴任何值),但在VBA中它填写感兴趣的价值观。我试过创建一个图表对象,但这似乎也没有用。

我觉得我已接近整理,但我无法理解。我想我可以把它作为一个VBA宏并从VB.NET中调用它,但这在某种程度上看起来很荒谬。任何帮助将不胜感激。我也对不同的方法持开放态度,这就是我遇到的在VBA中运作良好的事情,所以我认为这是一个很好的起点。

一如既往地谢谢!

2 个答案:

答案 0 :(得分:5)

我只需要更加努力地到达MSDN。事实证明你必须将chartobject放在图表中,我工作的代码看起来像:

  xlRange = xlWorkSheet.Range("B2:C6")
    xlRange.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture)
    Dim oChtobj As Excel.ChartObject = xlWorkSheet.ChartObjects.add(xlRange.Left, xlRange.Top, xlRange.Width, xlRange.Height)
    Dim oCht As Excel.Chart
    oCht = oChtobj.Chart
    oCht.Paste()
    oCht.Export(Filename:="C:\saveit.jpg")
    oChtobj.Delete()

我打算删除这个问题,因为它很快被我解决了(这忽略了我在这里发布它之前所花费的相当多的时间),但是当我搜索像我一样的问题时它会来到这个页面,也许这将有助于未来的人。如果您因某种原因想要将范围从excel复制到jpg(可能将其附加到outlook电子邮件的正文中,因为这就是我正在做的事情),这应该适合您。

答案 1 :(得分:2)

C#等价物需要调用Activate()或抛出COMException

Excel.Range xlRange = xlWorkSheet.Range("B2:C6");

range.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture);
Excel.ChartObject chartObj = myWorksheet.ChartObjects().Add(range.Left, range.Top, range.Width, range.Height);

chartObj.Activate();  // Don't Forget!

Excel.Chart chart = chartObj.Chart;
chart.Paste();
chart.Export(@"C:\image.png");

chartObj.Delete();