2012-05-23 4 views
2

У меня есть рабочий макрос excel vba, который делает то, что я хочу, от here, и я пытаюсь преобразовать его в VB.NET.Экспорт Excel в качестве изображения (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 

Что это делает принять ряд первенствовать, а затем положить его в график, который является копией диапазона и сохранить его как 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, поэтому я подумал, что это хорошая отправная точка.

Спасибо, как всегда!

ответ

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, потому что это то, что я делаю), это должно сработать для вас.

+0

Также стоит отметить, что вы должны удалить объект диаграммы, чтобы быть в состоянии сделать это несколько раз, в противном случае он будет срабатывать. oChtobj.Delete() - ваш друг. – asjohnson

2

И C# эквивалент требует вызова Активизировать() или 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(); 
Смежные вопросы