小弟要先說,這篇是參考 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的部分可以看參考上方的網頁、影片
裡面講得相當仔細,我覺得需要有細部調整需求的再去找找看吧。