通过电子邮件发送文本文件合并到excel之前

时间:2013-10-21 14:23:41

标签: vbscript

我有两个文本文件,其中包含以下内容:

FILE1.TXT:

Windows                  1.36
Linux                    2.78
MacOS                    3.45
Ubuntu                   4.12
FreePhysicalMemory      30.12
TotalVisibleMemorySize  48.00

FILE2.TXT:

MacOS                    6.39
Windows                  4.42
Linux                    5.76
Android                  3.46
FreePhysicalMemory      31.65
TotalVisibleMemorySize  48.00

output.xls:

OPERATING SYSTEM       SERVER1    SERVER2
Windows                  1.36     4.42
Linux                    2.78     5.76
MacOS                    3.45     6.39
Ubuntu                   4.12     0.00
Android                  0.00     3.46
FreePhysicalMemory      30.12     31.65
TotalVisibleMemorySize  48.00     48.00

我希望在VBScript程序或其他任何程序中实现以下两项操作,这些操作适合在Windows服务器上运行:

  1. 在excel中插入file1.txt和fil2.txt的内容 sheet output.xls如上所述。
  2. 将output.xls文件的内容邮寄为电子邮件中的正文。
  3. 我认为,Point2正在使用下面的代码实现,但没有得到如何在同一个程序中实现Point1。

    Const ForReading = 1
    Const ForWriting = 2
    Const ForAppending = 8
    Const FileToBeUsed = "c:\output.xls"
    Dim objCDO1
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FileToBeUsed, ForReading)
    Set objCDO1 = CreateObject("CDO.Message")
    objCDO1.Textbody = f.ReadAll
    f.Close
    objCDO1.TO ="sunny@abc.com"
    objCDO1.From = "dontreply@abc.com"
    objCDO1.Subject = "Server Memory"
    objCDO1.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration /sendusing") = 2 
    objCDO1.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtpb.intra.abc.com"
    objCDO1.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration /smtpserverport") = 25 
    objCDO1.Configuration.Fields.Update     
    objCDO1.Send
    Set f = Nothing
    Set fso = Nothing
    

    任何建议都受到高度赞赏。

    注意:我的目的是发送包含格式正确且对齐的数据的电子邮件。

    EDIT1:

    对于第1,2,3点,这是我所能做的。 不知道如何在HTML电子邮件正文格式中整合所有这些.. :(

    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
    
    Dim fso,f,objFSO,objFile,objRE, FileName
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 
    
    const strFileName1 = "D:\file1.txt"
    const strFileName2 = "D:\file2.txt"
    
    Set objFile = objFSO.OpenTextFile(strFileName1, fsoForReading) +    objFSO.OpenTextFile(strFileName2, fsoForReading)
    objobjFile.Close
    Set objFile = Nothing
    Set objFSO = Nothing
    

    Set objRE = New RegExp
    
    With objRE
        .Pattern    = "[A-Z][0-9]"
        .IgnoreCase = False
        .Global     = False
    End With
    
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 
    const strFileName1 = "D:\file1.txt"
    const strFileName2 = "D:\file2.txt"
    
    Set objFile = objFSO.OpenTextFile(strFileName1, fsoForReading) +   objFSO.OpenTextFile(strFileName2, fsoForReading)
    
    Do Until objFile.AtEndOfStream
        strSearchString = objFile.ReadLine
        Set colMatches = objRegEx.Execute(strSearchString)  
        If colMatches.Count > 0 Then
            For Each strMatch in colMatches   
                Wscript.Echo strSearchString 
            Next
        End If
    Loop
        objFile.Close
    

    Class memory1class
        Public operatingsystem, memory
    End Class
    Dim memory1dict: Set memory1 = CreateObject("Scripting.Dictionary")
    Dim memory2dict: Set memory2 = CreateObject("Scripting.Dictionary")
    
    Dim memory1: Set memory1 = new memory1class
    With memory1
        .operatingsystem = "?"
        .memory = "?"
    
    End With
    memory1dict.Add "1", memory1
    
    Dim memory1details: Set memory1details = memory1dict.Item("1")
    WScript.StdOut.WriteLine("operatingsystem:" & memory1details.first & " " &  memory1details.memory & " )
    

1 个答案:

答案 0 :(得分:1)

我不想直接给你代码,因为这是一个很好的机会让你了解更多关于你自己解决问题的不同选项,但我可以给你一个粗略的概述做。

  1. 打开两个文本文件进行阅读。 Windows提供了一个“脚本”库,其中包含FileSystemObject。您可以在下面声明它的实例,并且您可以谷歌了解如何使用它打开文本文件的具体信息:

    Set fso = CreateObject("Scripting.FileSystemObject")
    
  2. 一次读取一行中的每个文件。解析每一行以获得“名称”部分和“数字”部分作为不同的值。您可以通过组合InStrInStrRevMid函数来执行此操作,也可以使用功能更强大的RegExp库(VBScript的正则表达式类)。

    Set re = New RegExp
    
  3. 将每个“名称”和“值”存储到数据结构中供以后使用 - 我推荐了一个关联数组,例如VBScript的Dictionary类。对每个文本文件使用单独的文件将允许您稍后交叉引用它们。

    Set dictStats1 = CreateObject("Scripting.Dictionary")
    
  4. 要在电子邮件中正确显示格式正确的数据,我建议使用HTML表格。除了TextBody之外,CDO.Message对象还具有HTMLBody属性,允许您为电子邮件提供结构化格式,而不仅仅是原始文本。从w3school.com上的简单示例推断,您可以构造一个函数,该函数将接受两个字典并使用它们构造HTML表并将其作为字符串返回,以通过HTMLBody加载到电子邮件中属性。

  5. 我希望有所帮助!如果您对具体细节有任何疑问,请与我们联系。