从Windows窗体应用程序以横向模式打印SSRS报告

时间:2018-08-08 18:29:46

标签: c# winforms reporting-services reportviewer

我有一个Windows窗体应用程序,该应用程序具有textboxbutton和3 ReportViewer。 3个ReportViewer框被隐藏。当您在文本框中输入ShopOrder并单击按钮时,它将自动将“车间订单”值作为参数传递给所有3个报告,呈现报告,并在呈现完成后将报告呈现为EMF。文件,打印报告。

I am using this link as a guide to print SSRS reports automatically from a Windows Forms application.

我的应用程序中存在一些差异,因为我在ServerReports中使用ReportViewer而不是LocalReport。但是在完成所有这些更改之后,我的应用程序可以毫无问题地将它们全部打印出来。

但是我唯一的问题是,即使我的报告方向是“横向”,也无法将页面方向设置为Landscape

所以我想也许我需要相应地设置deviceInfo变量的PageWidthPageHeight变量,所以deviceInfo变量就是这样的:

string deviceInfo =
    @"<DeviceInfo>
        <OutputFormat>EMF</OutputFormat>
        <PageWidth>11in</PageWidth>
        <PageHeight>8.5in</PageHeight>
        <MarginTop>0.25in</MarginTop>
        <MarginLeft>0.25in</MarginLeft>
        <MarginRight>0.25in</MarginRight>
        <MarginBottom>0.25in</MarginBottom>
    </DeviceInfo>";

我有两个Export函数:ExportExportLandscape。上面的代码段是ExportLandscape的一部分。当我致电ExportLandscape时,我的报告仍以纵向打印。

我尝试从我的DeviceInfo变量中完全删除“页面设置”选项,只说OutputFormat。那也没有做到。

我还需要更改其他内容以使报告在Landscape中打印吗?我想念什么?

还值得注意的是,在我的3份报告中,有2份以横向打印,有1份以纵向打印。因此,我真的很想让我的应用程序仅在报告所在的任何页面设置中进行打印。我只是尝试获取报告的页面大小和报告的边距,并将其设置为我的DeviceInfo变量as suggested here。还是没有运气!

我刚刚尝试在Export(ReportViewer report)函数中添加断点并逐步执行。当我在即时窗口中看到report.ServerReport.GetDefaultPageSettings().PaperSize时,会看到以下信息:

{[PaperSize Letter Kind=Letter Height=1100 Width=850]}
    Height: 1100
    Kind: Letter
    PaperName: "Letter"
    RawKind: 1
    Width: 850

这使我感到即使我的报告设置为横向(高度= 8.5英寸,宽度= 11英寸),我的应用程序似乎也无法识别它。

重要更新:

我要打印的打印机有2个纸盒。当我打印肖像报告时,它将从具有默认纸张尺寸(纸盘2)的默认纸盘中取出。但是,当我的应用程序发送要打印的风景报告时,打印机尝试从纸盘1中取出纸张。当我在纸盘1中装入与纸盘2中相同的纸张时,它要求我输入纸的宽度和高度。 。当我告诉打印机横向打印时,打印机似乎不明白。或更确切地说,打印机认为这是一些未知的新设置。当我输入11的宽度和8.5的高度时,它将在人像纸上打印横向数据。

为使自己更清晰,正在打印的数据宽度为11高度为8.5。又名,只有75%的数据被打印。其余的部分将被推出页面,因为页面仍然是纵向放置。

1 个答案:

答案 0 :(得分:2)

您需要为用于打印的PageSettings使用合适的PrintDocument。您需要对该article的代码进行一些更改,以便能够以不同的纸张尺寸或页面布局进行打印。

首先,您需要创建一个合适的PageSettings,例如,如果您已将报表的默认页面设置设为横向:

var report = reportViewer1.LocalReport;
var pageSettings = new PageSettings();
pageSettings.PaperSize = report.GetDefaultPageSettings().PaperSize;
pageSettings.Landscape = report.GetDefaultPageSettings().IsLandscape;
pageSettings.Margins = report.GetDefaultPageSettings().Margins;

,或者如果您要创建新的页面设置:

var pageSettings = new PageSettings();
pageSettings.Landscape = true;
pageSettings.PaperSize = reportViewer1.PrinterSettings.PaperSizes.Cast<PaperSize>()
    .Where(x => x.Kind == PaperKind.A4).First();

然后在创建deviceInfo时使用pageSetting

string deviceInfo =
    $@"<DeviceInfo>
        <OutputFormat>EMF</OutputFormat>
        <PageWidth>{pageSettings.PaperSize.Width * 100}in</PageWidth>
        <PageHeight>{pageSettings.PaperSize.Height * 100}in</PageHeight>
        <MarginTop>{pageSettings.Margins.Top * 100}in</MarginTop>
        <MarginLeft>{pageSettings.Margins.Left * 100}in</MarginLeft>
        <MarginRight>{pageSettings.Margins.Right * 100}in</MarginRight>
        <MarginBottom>{pageSettings.Margins.Bottom * 100}in</MarginBottom>
    </DeviceInfo>";

最后,在PrintDocument中使用相同的pageSettings:

PrintDocument printDoc = new PrintDocument();
printDoc.DefaultPageSettings = pageSettings;

我创建了一个扩展方法,可以通过调用Print()Print(PageSettings)来简化打印报告的过程。您可以在这里找到它:Print RDLC Report without showing the ReportViewer