
В моей компании есть компьютерные отчеты, которые выводятся в виде таблиц Excel и отправляются по электронной почте в отдел выставления счетов. Они хотели бы, чтобы эти отчеты автоматически распечатывались по мере их получения.
Я уже нашел программу, которая автоматически загружает вложения электронной почты, она называетсяЗагрузчик почтовых вложений.
В идеале мне бы хотелось программу, которая:
- Сканируйте выбранную папку на предмет новых загруженных электронных таблиц XLS.
- Распечатайте их.
- Избавьтесь от них (желательно переместив их в другую папку).
Я знаю, что могу просто написать пакетный файл, чтобы позаботиться о #3; а #1 на самом деле не нужен. Я мог бы просто запустить программу в определенное время, чтобы автоматически распечатать все файлы, которые она видит, а затем запустить пакетный файл, чтобы переместить файлы куда-то еще. Но найти программу, которая будет автоматически распечатывать таблицы Excel, оказалось непросто.
Я видел несколько макросов Excel, которые автоматически печатают электронные таблицы, но я хочу, чтобы они автоматически открывались и печатались самостоятельно.
Одна из проблем, с которой я сталкиваюсь, заключается в том, что в отделе выставления счетов пока нет Microsoft Excel. В самом ближайшем будущем у них появится компьютер с Excel 2010, но пока там есть только LibreOffice.
решение1
Я использовал AutoIt для создания скрипта, который открывает Excel, открывает единственный файл (начинающийся с «elec») в указанной папке (начинающейся с «viat»), печатает его, закрывает Excel, а затем запускает пакетный файл для архивации только что распечатанного файла.
Вот код файла скрипта AutoIt. Я долго над этим ломал голову, пока не обнаружил, что мне нужны команды Sleep, чтобы заставить его работать правильно.
Run("C:\Program Files (x86)\Microsoft Office\Office14\Excel.exe")
WinWaitActive("Microsoft Excel")
Send("^o")
WinWaitActive("Open")
ControlClick("Open", "", 1148)
Send("c:\viat{DOWN}{ENTER}")
Sleep(1000)
Send("elec")
Sleep(1000)
Send("{DOWN}{ENTER}")
WinWaitActive("Microsoft Excel")
Send("^p")
Sleep(1000)
Send("{ENTER}")
Sleep(1000)
WinClose("Microsoft Excel")
Sleep(1000)
Run(""C:\Users\Chris\Documents\ViaTrack Archives\archiver.bat"")
А вот код архиватора.bat:
move "C:\ViaTrack Reports\*.*" "C:\Users\Chris\Documents\ViaTrack Archives"
Это чрезвычайно упрощенный код, но он выполняет свою работу. Главный недостаток этого скрипта в том, что он заставит Excel выдать ошибку, если файл не существует в папке. Однако он запланирован на запуск примерно через час после того, как файл обычно отправляется мне по электронной почте, чтобы учесть любые непредвиденные задержки.
Файл обычно отправляется по электронной почте в 5:40 утра каждый будний день. Исторически он никогда не приходил позже 5:45. Mail Attachment Downloader настроен на проверку новых вложений каждые 15 минут.
Сегодня утром все работало просто отлично. Менеджер отдела выставления счетов была рада прийти и обнаружить, что ее отчет ждет ее на принтере, и ей не пришлось распечатывать его самой.
решение2
Если в системе, из которой вы хотите их распечатать, установлен Excel, то вы можете использовать автоматизацию Excel из скрипта (который вы можете запустить из пакетного файла или вместо него).
Вот несколько примеров на VBScript и PowerShell:
VBscript .VBS (найденздесь):
Dim XLApp
Dim XLWkbk
Dim ObjArgs
set ObjArgs = wscript.arguments
if ObjArgs.count <> 1 then
wscript.echo "Invalid passed arguments"
wscript.quit
end if
Set XLApp = CreateObject("Excel.Application")
XLApp.Visible = False
Set XLWkbk = XLApp.Workbooks.Open(objargs(0))
XLWkbk.PrintOut
XLWkbk.Close False
XLApp.Quit
Set XLWkbk = Nothing
Set XLApp = Nothing
Set ObjArgs = nothing
Эквивалент PowerShell .PS1:
$excelApp = New-Object -comobject Excel.Application
if ($args.Length -lt 1)
{
Write-Host "Please provide full path and filename (ie: `"c:\books\excelfile.xlsx`")"
Exit
}
$excelBook = $excelApp.Workbooks.Open($args[0])
$excelBook.PrintOut()
$excelApp.Quit()