为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
MYYA 2021-11-21 10:41:17
我有一个 Windows 窗体应用程序,其中包含textbox、 abutton和 3 ReportViewer。3个ReportViewer盒子是隐藏的。当你ShopOrder在文本框中输入 a并点击按钮时,它会自动将 Shop order 值作为参数传递给所有 3 个报表,渲染报表,渲染完成后,将报表渲染为 EMF 文件,打印报表.我使用此链接作为从 Windows 窗体应用程序自动打印 SSRS 报告的指南。我的应用程序中有一些差异,因为我ServerReports在我的ReportViewer而不是LocalReport. 但是在所有这些更改之后,我的应用程序可以毫无问题地将它们全部打印出来。但我唯一的问题是,Landscape即使我的报告上的方向是横向,我也无法将页面方向设置为 。所以我想也许我需要相应地设置deviceInfo变量PageWidth和PageHeight变量,所以这就是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功能:Export和ExportLandscape。上面的代码片段是ExportLandscape. 当我调用 时ExportLandscape,我的报告仍然以纵向打印。我尝试从我的DeviceInfo变量中完全删除页面设置选项,并让它只说OutputFormat. 那也没有做到。我的报告要在横向打印时还有什么需要更改的吗?我错过了什么?还值得注意的是,在我的 3 份报告中,其中 2 份以横向打印,1 份以纵向打印。所以我真的希望我的应用程序只在报告所在的任何页面设置中打印它。我只是尝试获取报告的页面大小和报告的边距,并将它们设置为我的DeviceInfo变量,如此处建议的那样。仍然没有运气!我只是尝试在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 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

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


首先,您需要创建一个合适的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();

然后pageSetting在创建 deviceInfo 时使用:


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>";

最后,使用相同的 pageSettings PrintDocument:


PrintDocument printDoc = new PrintDocument();

printDoc.DefaultPageSettings = pageSettings;

我创建了一个扩展方法,以便通过调用Print()或来更轻松地打印报告Print(PageSettings)。您可以在这里找到它:打印 RDLC 报告而不显示 ReportViewer


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 274 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信