我创建了一个Crystal Report并将其连接到C:\SomeDir\Data.xml
上的XML文件。
在运行时,我可能需要将数据放在C:\SomeOtherDir\Data.xml
。
到目前为止我的代码看起来像这样:
ReportDocument report = new ReportDocument();
report.Load("Report.rpt");
PrinterSettings printerSettings = new PrinterSettings();
PageSettings pageSettings = printerSettings.DefaultPageSettings;
report.PrintToPrinter(printerSettings, pageSettings, false);
这将打印包含C:\SomeDir\Data.xml
数据的报告。我希望它在C:\SomeOtherDir\Data.xml
打印数据。
我该怎么做?
答案 0 :(得分:1)
ReportDocument report = new ReportDocument();
report.Load("Report.rpt");
DataSet reportData = new DataSet();
reportData.ReadXml(@"C:\SomeOtherDir\Data.xml");
report.SetDataSource(reportData);
PrinterSettings printerSettings = new PrinterSettings();
PageSettings pageSettings = printerSettings.DefaultPageSettings;
report.PrintToPrinter(printerSettings, pageSettings, false);
如果XML的架构发生变化,您将需要在CR编辑器中打开报告并“验证数据库”以更新它所绑定的架构,否则它将引发神秘的“登录失败”错误。
答案 1 :(得分:0)
在Java中,如果我希望在运行时替换一组新数据,我通常会加载该数据(无论是db或xml中的结果集还是其他),并通过rpt.Database.Tables将其推入。 setDataSource传递原始数据的“表别名”,因此CR知道要覆盖的内容。在C#中它可能类似。您可能想要了解它,尝试一下然后再回答更多问题。
答案 2 :(得分:0)
Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine
Imports BL
Public Class frmRptViewer
Dim strReportName As String
Dim ds As New DataSet
Public bl As New BL.InvoiceBL
Private Sub configureCrystalReports()
Dim strReportName As String
Try
strReportName = "Inv"
ds = bl.FillHDDT(TrnCode)
Dim strReportPath As String = Application.StartupPath & "\Reports\" & strReportName & ".rpt"
Dim rptDocument As New CrystalDecisions.CrystalReports.Engine.ReportDocument
ds.WriteXml(Application.StartupPath & "\xmlFiles\INVOICE.xml", XmlWriteMode.WriteSchema)
rptDocument.Load(strReportPath)
Dim crpConnectionInfo As New CrystalDecisions.Shared.ConnectionInfo
With crpConnectionInfo
.ServerName = Application.StartupPath & "\xmlFiles\INVOICE.xml"
.DatabaseName = "NewDataset"
.UserID = ""
.Password = ""
End With
Dim tblCurrent As Table
Dim crpTableLogOnInfo As New CrystalDecisions.Shared.TableLogOnInfo()
For Each tblCurrent In rptDocument.Database.Tables
tblCurrent.LogOnInfo.ConnectionInfo.ServerName = Application.StartupPath & "\xmlFiles\INVOICE.xml"
tblCurrent.LogOnInfo.ConnectionInfo.DatabaseName = "NewDataset"
tblCurrent.LogOnInfo.ConnectionInfo.UserID = ""
tblCurrent.LogOnInfo.ConnectionInfo.Password = ""
tblCurrent.LogOnInfo.ConnectionInfo.Type = CrystalDecisions.Shared.ConnectionInfoType.MetaData
Next
rptDocument.Database.Tables(0).SetDataSource(ds.Tables("Table"))
rptDocument.Database.Tables(1).SetDataSource(ds.Tables("Table1"))
crptViewer.ShowRefreshButton = False
crptViewer.ShowCloseButton = False
crptViewer.ShowGroupTreeButton = False
crptViewer.ReportSource = rptDocument
Catch ex As Exception
End Try
End Sub
答案 3 :(得分:0)
如果你需要从开始, 考虑您需要使用XML
在Crystelreport中显示打印DataGridView数据**(This is very helpful if you not using any database)**
此处示例代码
DataTable dt = new DataTable();
dt.Columns.Add("Item_Id", typeof(string));
dt.Columns.Add("Categry", typeof(string));
dt.Columns.Add("Item_Name", typeof(string));
dt.Columns.Add("Unit_Price", typeof(double));
dt.Columns.Add("Quantity", typeof(int));
dt.Columns.Add("Discount", typeof(string));
dt.Columns.Add("Total_Payable", typeof(double));
foreach (DataGridViewRow dgr in DGVsell.Rows)
{
dt.Rows.Add(dgr.Cells[0].Value, dgr.Cells[1].Value, dgr.Cells[2].Value, dgr.Cells[3].Value, dgr.Cells[4].Value, dgr.Cells[5].Value, dgr.Cells[6].Value);
}
ds.Tables.Add(dt);
ds.WriteXmlSchema("Bill.xml");
注意如果错误使Xml更改 App.config 文件如下
<?xml version="1.0" encoding="utf-8"?>
<configuration>
</startup>-->
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
制作xml文件后,您可以拨打Crystel报告
frmreport obj = new frmreport(); //load report viwer form
obj.ShowDialog();
报告viwer中的
crBill cr = new crBill();
cr.SetDataSource(frmSell.ds);
crystalReportViewer1.ReportSource = cr;
crystalReportViewer1.RefreshReport();
crystalReportViewer1.Refresh();