Friday, February 6, 2009

Export Crystal Report to PortableDocFormat (PDF)

แปลงไฟล์ของ crystal report เป็น PDF เพื่อแสดงผล
  • จากปัญหาเรื่องการ close และ dispose crystal report ถ้าโค้ดของบทความก่อนหน้าแก้ไม่ได้
  • ทำตามที่เพื่อนแนะนำเลยดีมั้ย คือ ส่งออกมันเป็น pdf แล้วแสดงผล pdf แทน crystal report เลยมะ ^^'
Go
  • เขียนโค้ดเหมือนเดิม เช่น สร้าง connection database, query ข้อมูล , สร้าง file.xsd
  • จากนั้นนำโค้ดด้านล่างเนี๋ยต่อท้ายเลย

MemoryStream oStream;
Response.Clear();
Response.Buffer = true;

ReportDocument crReportDocument = new ReportDocument();
//crReportDocument.Load("c:\\Inetpub\\wwwroot\\ContainerRepair\\EstimateOfRepairs.rpt");
crReportDocument.Load(Server.MapPath(@"Branch.rpt"));
crReportDocument.Database.Tables[0].SetDataSource(ds.Tables[0]);

//crReportDocument.SetParameterValue("Pam1", branchCode);

CrystalReportViewer1.ReportSource = crReportDocument;
CrystalReportViewer1.DataBind();

oStream = (MemoryStream)crReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);

Response.ContentType = "application/pdf";
crReportDocument.Close();
crReportDocument.Dispose();

try
{
Response.BinaryWrite(oStream.ToArray());
Response.End();
}
catch (Exception)
{}
finally
{
oStream.Flush();
oStream.Close();
oStream.Dispose();
}

  • หรือ เราสามารถเขียนเป็น method แค่ส่ง reportdocument ไปก็พอได้ประมาณนี้
// ทำเป็น static public ไม่ได้หว่าติด Response นี่แหละ
void ExportPdf(ReportDocument crReportDocument)
{
MemoryStream oStream;
Response.Clear();
Response.Buffer = true;

oStream = (MemoryStream)crReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);

Response.ContentType = "application/pdf";
crReportDocument.Close();
crReportDocument.Dispose();

try
{
Response.BinaryWrite(oStream.ToArray());
Response.End();
}
catch (Exception)
{ }
finally
{
oStream.Flush();
oStream.Close();
oStream.Dispose();
}
}
  • โค้ดก็จะประมาณนี้
        ReportDocument crReportDocument = new ReportDocument();
//crReportDocument.Load("c:\\Inetpub\\wwwroot\\ContainerRepair\\EstimateOfRepairs.rpt");
crReportDocument.Load(Server.MapPath(@"Branch.rpt"));
crReportDocument.Database.Tables[0].SetDataSource(ds.Tables[0]);

//crReportDocument.SetParameterValue("Pam1", branchCode);

//CrystalReportViewer1.ReportSource = crReportDocument;
//CrystalReportViewer1.DataBind();

ExportPdf(crReportDocument);
Notes:
  • โค้ดตัวอย่างนี้ ไม่ใช่การเขียนไฟล์ pdf แล้วเรียก pdf นะ
  • คือ จะเป็น pdf แบบ stream อยู่ยังไม่เป็นไฟล์
  • ถ้าเราต้องการสร้างไฟล์ pdf ไว้ด้วยเราต้องนำ oStream ไปเขียนเป็นไฟล์เอง
  • ถ้าเป็น app เราใช้ประมาณนี้น่าจะได้ crystalReportViewer1.ExportReport();
  • หรือ reportDocument.ExportToDisk(ExportFormatType.Excel, @"D:\MyFile.xls");
Related Post:
References:

No comments:

Post a Comment