【问题标题】:Copying values from excel to body of outlook email vb.net将值从 excel 复制到 Outlook 电子邮件 vb.net 的正文
【发布时间】:2012-05-29 06:23:32
【问题描述】:

所以这是我之前提出的问题的更精致版本。很长一段时间以来,我一直试图解决这个问题。我找到了一个有意义的网站,但由于某种原因我无法实现它。我只是希望能够将 excel 中的信息(表格、图表、范围等)复制到 Outlook 电子邮件的正文中。

从这里: http://pastebin.com/4VWmcrx6

它暗示:

Using VB.NET to copy Excel Range (a table) to body of Outlook email
Sub CopyFromExcelIntoEMail()
Dim Doc As Word.Document
Dim wdRn As Word.Range
Dim Xl As Excel.Application
Dim Ws As Excel.Worksheet
Dim xlRn As Excel.Range

Set Doc = Application.ActiveInspector.WordEditor
Set wdRn = Doc.Range

Set Xl = GetObject(, "Excel.Application")
Set Ws = Xl.Workbooks("Mappe1.xls").Worksheets(1)

Set xlRn = Ws.Range("b2", "c6")
xlRn.Copy

wdRn.Paste
End Sub

我尝试了它的几种变体,但都没有运气。

Imports System.Data
Imports System.IO
Imports Microsoft.Office.Interop
Imports Office = Microsoft.Office.Core
Imports xlNS = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices
Imports System.Net.Mail
Imports excel1 = Microsoft.Office.Interop.Excel
Imports word1 = Microsoft.Office.Interop.Word
Imports outlook1 = Microsoft.Office.Interop.Outlook

Module Module1

    Sub Main()
        Dim Doc As Word.Document
        Dim wdRn As Word.Range
        Dim Xl As Excel.Application
        Dim Ws As Excel.Worksheet
        Dim xlRn As Excel.Range

        Dim application As New Outlook.Application
        Dim mail As Outlook.MailItem = CType(application.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)


        Doc = Application.ActiveInspector.WordEditor
        wdRn = Doc.Range

        Xl = GetObject("C:\Users\ajohnson\Desktop\Book1.xlsx", "Excel.Application")
        Ws = Xl.Workbooks("Book1").Worksheets(1)

        xlRn = Ws.Range("a1", "d2")
        xlRn.Copy()

        With mail
            .Body = wdRn.Paste() & vbCr & wdRn.Paste()

        End With

    End Sub

End Module

这似乎不应该那么困难,而且我对正在发生的事情有一个合理的了解,但无论我尝试什么都行不通。该代码在

上引发 com 异常
Doc = Application.ActiveInspector.WordEditor

我也尝试使用提供的代码,但它说应用程序未定义。

任何帮助将不胜感激,一如既往地感谢您。

对于后代(我到处都看到这个问题):@Siddharth Rout 的解决方案肯定会奏效,但如果你想让它不会在黑莓上被截断(它实际上出现了,我发誓)更好方法可以在 cmets 中找到。

Sub Export_Range_Images()

' =========================================
' Code to save selected Excel Range as Image
' =========================================

Dim oRange As Range
Dim oCht As Chart
Dim oImg As Picture
Set oRange = Range("A1:B2")
Set oCht = Charts.Add
oRange.CopyPicture xlScreen, xlPicture
oCht.Paste

oCht.Export FileName:="C:\temp\SavedRange.jpg", Filtername:="JPG"

End Sub 

这来自here,以及:

.HTMLBody="< img src='C:\Temp\logo.jpg'>" & vbCr & "< img src='C:\Temp\logo.jpg'>"

来自here.

您的想法是创建您感兴趣的范围/表格的 .jpg 文件,然后使用 html 将它们放入电子邮件的正文中。在这两种方法之间,您应该能够让它发挥作用。

【问题讨论】:

    标签: vb.net excel com outlook


    【解决方案1】:

    我在这里使用了 Ron 的 RangetoHTML 函数。

    Imports Excel = Microsoft.Office.Interop.Excel
    Imports Olook = Microsoft.Office.Interop.Outlook
    
    Public Class Form1
        '~~> Define your Excel Objects
        Dim xlApp As New Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim xlRange As Excel.Range
    
        '~~> Define Outlook Objects
        Dim olApp As New Olook.Application
        Dim olMail As Olook.MailItem
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            '~~> Opens an exisiting Workbook. Change path and filename as applicable
            xlWorkBook = xlApp.Workbooks.Open("C:\Sample.xlsx")
            '~~> Set the relevant sheet that we want to work with
            xlWorkSheet = xlWorkBook.Sheets("Sheet1")
    
            xlRange = xlWorkSheet.Range("A1:F20")
    
            olMail = olApp.CreateItem(0)
    
            On Error Resume Next
            With olMail
                .To = "INSERT TO EMAIL HERE"
                .CC = ""
                .BCC = ""
                .Subject = "This is the Subject line"
                .HTMLBody = RangetoHTML(xlRange)
                .Display()   'or use .Send to send it
            End With
            On Error GoTo 0
    
            '~~> Close the File
            xlWorkBook.Close (False)
    
            '~~> Quit the Excel Application
            xlApp.Quit()
    
            '~~> Clean Up
            releaseObject (xlApp)
            releaseObject (xlWorkBook)
    
            '~~> Similarly cleanup for outlook. not including as I am using .Display()
    
        End Sub
    
        Function RangetoHTML(rng As Excel.Range)
            ' Changed by Ron de Bruin 28-Oct-2006
            ' Working in Office 2000-2010
            Dim fso As Object
            Dim ts As Object
            Dim TempFile As String
            Dim TempWB As Excel.Workbook
    
            TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    
            'Copy the range and create a new workbook to past the data in
            rng.Copy()
    
            TempWB = xlApp.Workbooks.Add(1)
    
            With TempWB.Sheets(1)
                .Cells(1).PasteSpecial(Paste:=8)
                .Cells(1).PasteSpecial(-4163, , False, False)
                .Cells(1).PasteSpecial(-4122, , False, False)
                .Cells(1).Select()
                xlApp.CutCopyMode = False
                On Error Resume Next
                .DrawingObjects.Visible = True
                .DrawingObjects.Delete()
                On Error GoTo 0
            End With
    
            'Publish the sheet to a htm file
            With TempWB.PublishObjects.Add( _
                 SourceType:=4, _
                 Filename:=TempFile, _
                 Sheet:=TempWB.Sheets(1).Name, _
                 Source:=TempWB.Sheets(1).UsedRange.Address, _
                 HtmlType:=0)
                .Publish (True)
            End With
    
            'Read all data from the htm file into RangetoHTML
            fso = CreateObject("Scripting.FileSystemObject")
            ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
            RangetoHTML = ts.ReadAll
            ts.Close()
            RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                                  "align=left x:publishsource=")
    
            'Close TempWB
            TempWB.Close(savechanges:=False)
    
            'Delete the htm file we used in this function
            Kill (TempFile)
    
            ts = Nothing
            fso = Nothing
            TempWB = Nothing
        End Function
    
        '~~> Release the objects
        Private Sub releaseObject(ByVal obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject (obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub
    End Class
    

    【讨论】:

    • 一个很好的建议。我遇到的一件事是在黑莓上很难阅读,这当然是我生活的噩梦。我们目前所做的是将东西粘贴为图片。你认为有办法做到这一点吗?从我的阅读来看,我似乎可以将一个范围保存为 .jpg,然后将图像包含在文件中(带有 的 html 样式)。再次感谢您尝试的好主意。
    • 更换你的BB型号。像我一样使用黑莓手电筒 9860 LOL。除了开个玩笑,是的,您也可以插入图像。试一试,如果你遇到困难,让我知道,我会给你一个例子:)
    • 哦,伙计,你不知道我想说“黑莓太烂了,就用别的吧”有多糟糕,但这当然不会很好。我遇到的图片问题是我无法访问剪贴板。我知道如何在 excel 中选择我的范围并复制为图像,但我无法将其转储到电子邮件正文中。我应该以某种方式使用 RangetoHTML 吗?也许对它进行一些修改?如果你有办法让它发挥作用,你就是我的英雄! :D 如果我得到解决方案,我会修补并告诉你。
    • 是的,我有一个解决方案,但我会等你试一试?没有比自己发现解决方案更大的乐趣了 ;)
    • 好吧,到目前为止,对我来说似乎很明显的解决方案(根据宏记录器中的操作将 .copy 更改为 .copypicture)并不好:rng.CopyPicture(Excel .XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlPicture)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多