Word’ü Windows Sunucu Zamanlanmış Görevinde Otomatikleştirme

Womanne

Member
Arka plan işleminde başlayan Word Otomasyonu nesneleri ile ilgili sorunlar nasıl giderilir.


Yazılım geliştiricilere yönelik teknik desteğimizin bir parçası olarak, bu hafta, bir Windows sunucusunda zamanlanmış bir görevde Windows Forms ile bir .NET uygulamasını periyodik olarak ve kullanıcı müdahalesi olmadan çalıştırmak isteyen bir müşteriden bir talep aldım. Windows Forms uygulamasının görevi, Microsoft Word belgesini (.docx) PDF belgelerinde. Bunun için Word’ün nesne modeli kullanılmıştır. Çıktılar bir formda yapılmıştır. ile hatalar yapıldı MessageBox.Show() piyasaya sürülmüş. Dönüşüm daha önce manuel olarak tetiklendi ve şimdi otomatik olarak yapılması gerekiyor.

Grafik kullanıcı arabirimleri, Windows’ta zamanlanmış bir görevde görünemez. Bu nedenle, ilk adım, Windows Forms uygulamasını bir konsol uygulamasına dönüştürmek, yani GUI öğelerine yapılan tüm referansları konsol çıktısıyla değiştirmekti. İşte Word nesne modelini kullanan önemli bir kod parçacığı:

/// <summary>
/// Convert DOCX to PDF
/// </summary>
/// <param name="docxPath">Path to DOCX</param>
/// <param name="pdfPfath">Path to resulting PDF</param>
public void DOCXtoPDF(string docxPath, string pdfPfath)
{
Word.Application app = null;
Word.Document doc = null;
try
{
Console.WriteLine("Starting Word...");
app = new Word.Application();
// only for Debugging!. Word must be invisible when running in a background job
app.Visible = System.Diagnostics.Debugger.IsAttached;
app.ScreenUpdating = System.Diagnostics.Debugger.IsAttached;
Console.WriteLine("Loading Word Document: " + docxPath);
doc = app.Documents.Open(docxPath);
Console.WriteLine("Save as PDF: " + pdfPfath);
doc.SaveAs(pdfPfath, Word.WdSaveFormat.wdFormatPDF);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
finally
{
if (doc != null)
{
Console.WriteLine("Closing Document...");
doc.Close(SaveChanges: false);
doc = null;
}
if (app != null)
{
Console.WriteLine("Closing Word...");
app.Quit();
app = null;
Console.WriteLine("Done!");
}
}
}

Şimdi uygulamanın aşağıdaki durumlarda çalıştığı ortaya çıktı:

  • dosya sisteminde uygun haklara sahip bir kullanıcı hesabıyla Windows komut isteminde etkileşimli olarak.
  • “Yalnızca kullanıcı oturum açtığında çalıştır” seçeneğini belirlediyseniz, Görev Zamanlayıcı’da aynı kullanıcı hesabıyla.
Ancak, “Kullanıcı oturum açmış olsa da olmasa da çalıştır” seçildiğinde Word Otomasyonu durdu.

Çözüm, sunucuda boş (!) bir dizin oluşturmaktı:


  • 32 bitlik bir sözcük için: C:WindowsSysWOW64configsystemprofileDesktop
  • 64 bitlik bir kelime için: C:WindowsSystem32configsystemprofileDesktop
Aslında burada yollar tersine dönmez, WOW64 açıklamasına bakın. Bu dizini oluşturmamızın nedeni, Word’ün bir masaüstü uygulaması olması ve bir sunucuda arka plan otomasyonu için pek uygun olmamasıdır. Bunun için Aspose Words veya TextControl sunucu bileşeni gibi yazılım bileşenlerini kullanmalısınız.

Başka bir ipucu: Teşhis için konsol çıktısını kullanmak için, onu zamanlanan görevde bir günlük dosyasına aktarmanız gerekir. Aşağıdaki ayar çalışmıyor çünkü .exe-Uygulamanın kendisi >> ile borulamayı anlamıyor (bir dosyaya ekle).

program/komut dosyası: ofis otomasyonu.exe
Argüman ekleyin: >>log.txt
Den başlayarak: x:klasör adı

Windows giriş isteminden önce gelmek doğrudur (ayrıca şekle bakın):

program/komut dosyası: komut
Argüman ekleyin: /c .OfficeAutomatisierung.exe >>log.txt
Den başlayarak: x:klasör adı




zamanlayıcı ayarları





()



Haberin Sonu
 
Üst