我有一个计划任务设置(在一个单独的程序中),它将通过电子邮件发送.xlsx文件。我有一个规则设置,将电子邮件保存到名为04_CFW REPORT的Outlook文件夹
我需要Outlook使用Excel打开文件并将.csv另存为网络驱动器。
这将发生在晚上,当我离开电脑时
我发现的最接近的功能是: http://www.devhut.net/2012/05/14/ms-access-vba-convert-excel-xls-to-csv/
但我不知道如何将此功能用于子。
非常感谢任何帮助。
答案 0 :(得分:0)
这可能是一个开始的地方。取自here
然后你可以研究creating a powershell job每天运行一次并循环直到找到指定的电子邮件主题。
另外需要考虑的一点是,如果您有权限,Powershell可以执行SQL查询并输出可以转换为XLSX的CSV。
Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = new-object -comobject outlook.application
$namespace = $outlook.GetNameSpace("MAPI")
$folder = $namespace.getDefaultFolder($olFolders::olFolderInBox)
然后我可以使用例如任何未读的项目来过滤收件箱项目。
$folder.items | where {$_.UnRead -eq $true}
***编辑,让PowerShell正确关闭Excel的comobject。这是正确释放COM对象的问题。首先(假设没有这样做)我们保存工作簿并退出Excel。
接下来,我们将COM对象从最小的(这里是包含一系列单元格的变量)释放到循环中的最大(Excel ComObject变量),如果需要多次迭代。现在我注意到的最后两行并不是真的需要,但在测试脚本时,除了运行垃圾收集之外,它很好。观察任务管理器以确认其操作。
$xlsObj.ActiveWorkbook.SaveAs($xlsFile) | Out-Null
$xlsObj.Quit()
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsRng)) {'cleanup xlsRng'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsSh)) {'cleanup xlsSh'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsWb)) {'cleanup xlsWb'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsObj)) {'cleanup xlsObj'}
[gc]::collect() | Out-Null
[gc]::WaitForPendingFinalizers() | Out-Null