[.net MVC][RDLC] RDLC 繪製 Gantt 甘特圖

小弟要先說,這篇是參考 http://pnarayanaswamy.blogspot.com/  和 影片

就是由於我在寫這功能時,實在花滿多時間踩雷、嘗試過太多方式

由於我接收到的需求是要把資料產生成甘特圖,並輸出PDF,再對PDF做與其他PDF合併的需求。

所以甘特圖的部分有先嘗試過 KendoUI的甘特圖輸出PDF - 這部分會遇到中文的問題 由於 Kendo UI 本身是用 Dejavu Sans 的字型 還需額外覆蓋

況且最後需求是希望用後端產生,不希望需要到前端網頁(由Kendo產生)才能拿到甘特圖,所以才用了RDLC 來當繪製甘特圖的元件。

--------------------------------------------------

好的那我們就從最前面開始吧

我使用的是 Microsoft.Visual Studio 2017 , .Net 4.8 

先給各位看結果的輸出

如果這跟你所要的長得有點類似,那就往下面看看吧

1. 首先一開始當然是從 NuGet 先安裝 RDLC

(要有這個才能在Visual Studio 上做介面上的開發)

2.建立Rdlc(由於是在MVC內,我這邊就建立Report資料夾,並對資料夾按下新增項目)

並找到報表這個項目,按下後

3.點下後會看到一個空白的設計畫面,右鍵插入 [範圍的橫條圖]

4.會跳出要你加入資料的視窗(如果是原本就先做好資料集的人可直接選,沒有的可直接按取消),取消後會看到空白模板的甘特圖

5.接下來 我這邊只打算說明 A,B,C細部的一些設定,我想每個人遇到的需求都有所不同

但我這邊也只打算講到大家可能會共用的部分,剩下的需求就靠大家Google 或者是 看我上面參考的網站、影片(其實影片、文章都寫得非常清楚 跟著做、需要的細部微調 都有寫)

這邊的中文其實寫的不是很清楚,但值的對應就是我上面圖片的對應。

6.資料集的導入,創建資料集一樣就是在Report 按新增項目,選Data類別就會看到資料集.xsd 的選項 (這邊也不再贅述)

7.在按下右邊綠色箭頭 新增欄位後,再按下右鍵選擇數列屬性,即可看到上界和下界值

這邊就直接可以是後面檢前面的屬性,直接做計算

8.再來就只是程式的把資料填入RDLC裡面 

ReportDataSource(string,IEnumerable)

   LocalReport localReport = new LocalReport();
            localReport.ReportPath = rdlcPath;
            ReportDataSource rds = new ReportDataSource("DataSet1", ganttData);//此處"DataSet1"就是Report報表裡資料集的名稱,一定要對應起來才可以對報表裡的正常繫結賦值
            localReport.DataSources.Add(rds);
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;
            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <EmbedFonts>None</EmbedFonts>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;
            //如果 RDLC 有帶入參數
            //localReport.SetParameters(
            //new List<ReportParameter> {
            //    new ReportParameter("reportYear", "2019")            }
            //);

            //寫成Bytes 直接寫入對應的Pdf
            renderedBytes = localReport.Render(
                            reportType,
                            deviceInfo,
                            out mimeType,
                            out encoding,
                            out fileNameExtension,
                            out streams,
                            out warnings);
            //寫入PDF
            System.IO.File.WriteAllBytes(Path.Combine("path","Merge002.pdf"), renderedBytes);

 

由於我之後是需要把RDLC 寫入PDF,所以後面做的事情都是在把資料倒進PDF裡面。

-----2019/09/26 補充

LocalReport.Render 

會需要在WebConfig <appSetting> 加入 <add key="Glimpse:DisableAsyncSupport" value="true" />  

------

結語:以上是我大略的講完這次RDLC輸出PDF的介紹,我覺得細部調整RDLC的部分可以看參考上方的網頁、影片

裡面講得相當仔細,我覺得需要有細部調整需求的再去找找看吧。