由于我无法控制的情况下,我用自制的XML报告,这些报告工作精美取代我们所有的Crystal Reports。对于弹出Crystal Reports查看器的大多数报表,以下代码可在IE中很好地打开它们,并通过XSLT样式表将其转换为HTML。
ProcessStartInfo psi = new ProcessStartInfo(reportFilename)
{
UseShellExecute = true
};
using (Process p = new Process {StartInfo = psi})
{
p.Start();
}
问题在于某些报告只是直接打印到打印机,而从未向用户显示该报告,这在CR中工作正常。我无法弄清楚如何使用上面的代码来做到这一点。
我暂时不希望如果可能的话特别推出一个IE进程,但我保证,他们正在运行的Windows,所以这不是一个硬性要求。此外,将通过这种方式直接打印通过XSL将XML转换为HTML和打印,或只是打印实际的XML文本?
编辑:我已经尝试添加:
Verb = "Print"
到ProcessStartInfo对象,但风了一个异常被抛出一句话:
"No application is associated with the specified file for this operation"
再次编辑:指定IE的exe文件来启动再次加载XML就好了,但不提供“打印”操作。添加“window.print()”在JavaScript块的工作,但允许脚本运行后,需要手动点击打印按钮,因为IE阻止它。
编辑第三:我的老板告诉我不要它担心,他们可以从IE打印。我仍然想弄清楚这一点。我试着在命令行“print.exe”,但只打印原始XML到打印机。试图XslCompiledTransform用PrintDocument的,但是这不是我要找的,无论是。
最佳答案
终于明白了。我刚刚创建了一个不可见的WebBrowser控件来执行IE渲染,然后在DocumentCompleted上调用其Print()方法。使用默认打印机设置可以像超级按钮一样工作。
private static void PrintReport(string reportFilename)
{
WebBrowser browser = new WebBrowser();
browser.DocumentCompleted += browser_DocumentCompleted;
browser.Navigate(reportFilename);
}
private static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = sender as WebBrowser;
if (null == browser)
{
return;
}
browser.Print();
browser.Dispose();
}