\

Facebook


วันอังคารที่ 22 สิงหาคม พ.ศ. 2560

[VS 2017] ReportViewer เทพออกรายงานตลอดกาลของ .Net


เวลาทำเว็บไปได้สักพักจนเริ่มมีคนใช้งานเยอะชึ้น user จะเริ่มถามหารายงาน สรุปยอด ผลงานเเต่ละวัน ซึ่งโจทย์ที่ได้มาจะเป็นแบบนี้ "ช่วยทำโมดูลรายงาน สรุปยอดให้หน่อย เอาที่สามารถค้นหาได้แล้วพิมพ์ออกมาเป็น Excel หรือไฟล์ PDF ได้ด้วยนะ" ครบเลย.. ถ้าเป็นเมื่อก่อนผมจะเขียนหน้า แสดงรายงานตามผลการค้นหา แล้วใช้ lib อีกตัวมาปั้นไฟล์ Excel อีกทีหนึ่ง

มันก็โอเคแต่เสียเวลาสัสๆ ทั้งเวลาเขียนโปรแกรม และเวลาตอนออกเอกสาร ดังนั้นเพื่อแก้ปัญหาเรื่องเวลา ถ้าใช้ .Net ผมอยากแนะนำให้รู้จัก ReportViewer แล้วชีวิตจะง่ายขึ้น

มันเป็นโมดูลหนึ่งของ Reporting Service ที่อยู่ใน .Net ตั้งเเต่ยุค Web Form จนมาถึงยุค MVC แล้วโมดูลนี้ก็ยังไม่ตาย มีคนเอามาประยุกใช้โดยเอา MVC ครอบ WebForm อีกทีหนึ่งเพื่อใช้งาน module ReportViwer ซึ่ง version ปัจจุบันที่ผมคือ 14.0 ซึ่งหน้าตามันจะดูขาวๆโมเดิลขึ้นมาหน่อย

ชอบตรงไหน 

ตรงที่โยน List, DataTable เข้าไปใน datasource ตารางก็โพล่แล้ว จัดว่าง่าย
ตรงที่มีปุ่ม download Excel หรือ PDF มาให้เลยไม่ต้องเขียนเพิ่ม

เกลียดมันที่ 

ต้องใช้ไฟล์ rdlc เป็น template เอกสาร แล้วไอ้ไฟล์นี้ต้องแก้ใน Visual Sutio ผ่าน Report Designer
ต้องมี Model มารองรับทุก DataSet ที่แสดงในรายงาน

เริ่มเลยขี้เกียจพิมพ์!! 

1 ไปที่โปรเจค์ MVC สร้าง Controller มาใหม่ สร้าง Action มาใหม่แล้วสร้าง View ว่างๆมา บลาๆๆ
2. สร้างโฟลเดอร์ใหม่ใต้โปรเจคชื่อ Report ข้างในนั้น Add New Item.. เลือก WebForm C# ตั้งชื่อว่า ViewReport.aspx
3. ไปที่ package management พิมพ์

Install-Package Microsoft.ReportingServices.ReportViewerControl.WebForms

หรือ NuGet :
"ReportViewerControl.WebForms"

4. ไปที่ไฟล์ ViewReport.aspx ใส่โค๊ดที่หัว


<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>


5.ใส่ ScriptManagerControl
6. เพิ่มโมดูล ReportViewer


<rsweb:ReportViewer ID="ReportViewer1" runat="server" ProcessingMode="Remote">

<ServerReport ReportPath="" ReportServerUrl="" />

</rsweb:ReportViewer>


คราวนี้เราจะ design ไฟล์ template แล้วถ้าใช้  VS 2017 เหมือนผมให้ถามกูเกิ้ลว่า "Microsoft Rdlc Report Designer for Visual Studio" แล้ว download มา install

สร้าง RDLC กัน

1. Add new Item.. > ค้นหา Report เเล้วเลือก Report ตั้งชื่อไฟลล์ว่า reportTemplate.rdlc 
2. เพิ่ม Add New Item.. > Visual C# > Data > DataSet ตั้งชื่อ dsMapper.xsd แล้วสร้าง column ใหม่สองอันชื่อ firstname (string) , surname (string)
2. ดับเบิ้ลคลิกไฟล์ rdlc ใต้ folder DataSet กดสร้างไหม เลือก dsMapper มาเป็น DataSource
3. เเล้วเพิ่มตารางลงในเอกสร้าง insert > table ลากคอลัมจาก folder DataSet มาวาง จัดทรงให้สวย



แสดงรายงาน ก้อปโค๊ดข้างล่าง ไปไว้ใน ViewReport.aspx.cs


DataTable table = new DataTable();

            table.Columns.Add("FirstName", typeof(string));

            table.Columns.Add("SurName", typeof(string));



            // Here we add five DataRows.

            table.Rows.Add("ชิน", "ชยุต");

            table.Rows.Add("Chayut", "Chin");

            table.Rows.Add("Hydralazine", "Christoff");

            table.Rows.Add("Combivent", "Janet");

            table.Rows.Add("Dilantin", "Melanie");



            if (!IsPostBack)

            {

                string ReportFile = HttpContext.Current.Request.PhysicalApplicationPath

                + "Report\\reportTemplate.rdlc";

                ReportViewer1.LocalReport.ReportPath = ReportFile;

              



                var rp = new ReportParameter("rp_name", "หัวเรื่อง".ToString());

                ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp });

              

                /// add more sheet

                ReportDataSource rds = new ReportDataSource("DataSet1", table);

                ReportViewer1.LocalReport.DataSources.Add(rds);

                ReportViewer1.LocalReport.Refresh();

            }


พอกด รันโปรเจค หน้ารายงานจะขึ้นละ


อยากให้ดู web.config ส่วนที่เพิ่มมาคือ


ทีนี้ถ้าอยากใช้ใน MVC ก็ครอบ ViewReport.aspx ด้วย iFrame ซะ จำไอ้ View ว่างๆข้อแรกได้ไหม ใส่โค๊ดข้างล่างนี้ลงไป เช่น


<iframe src="~/Report/ViewReport.aspx?@ViewBag.queryStr" width="100%" height="410px"></iframe>


จบงาน..

1 ความคิดเห็น:

Kob กล่าวว่า...

Rdlc อยากให้แสดง progress bar ว่ากำลัง render ข้อมูลถึงไหนแล้ว ทำอย่างไรคะ

May be like this posts