[C#]由Crystal Report匯出檔案

透過Crystal Report的報表檔產出PDF、Image等檔案格式,方便做檔案的搬遷或者mail。

以下兩個function分別做了不同的事情,第一個function會將報表檔產生到特定路徑下,方便進行檔案管理,

01         /// <summary>
02         /// 透過crystal report產出報表結果檔
03         /// </summary>
04         /// <param name="pReportPath">報表rpt檔的實體路徑</param>
05         /// <param name="pExportFileName">要輸出的檔案路徑</param>
06         /// <param name="pReportData">要餵進去的資料</param>
07         /// <param name="pExpertFormatType">輸出的檔案類型(PortableDocFormat=PDF,不支援XML與IMAGE)</param>

08         public void getCrystalReportFile(string pReportPath, string pExportFileName, DataTable pReportData, ExportFormatType pExpertFormatType)
09         {
10             ReportDocument tCRReportDocument = new ReportDocument();
11
12             //載入該報表
13             tCRReportDocument.Load(pReportPath);
14             //設定資料
15             tCRReportDocument.SetDataSource(pReportData);
16
17             switch (pExpertFormatType.ToString())
18             {
19                 case "EXCEL":
20                     tCRReportDocument.ExportToDisk(ExportFormatType.Excel, pExportFileName);
21                     break;
22                 case "HTML3.2":
23                     tCRReportDocument.ExportToDisk(ExportFormatType.HTML32, pExportFileName);
24                     break;
25                 case "HTML4.0":
26                     tCRReportDocument.ExportToDisk(ExportFormatType.HTML40, pExportFileName);
27                     break;
28                 //case "XML":
29                 //    tResult = getCrystalReportFile(tPath, tSQLTable, ExportFormatType.PortableDocFormat);
30                 //    break;
31                 case "CSV":
32                     tCRReportDocument.ExportToDisk(ExportFormatType.ExcelRecord, pExportFileName);
33                     break;
34                 case "PDF":
35                     tCRReportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, pExportFileName);
36                     break;
37                 //case "IMAGE":
38                 //    tResult = getCrystalReportFile(tPath, tSQLTable, ExportFormatType.);
39                 //    break;
40                 default:
41                     tCRReportDocument.ExportToDisk(ExportFormatType.Excel, pExportFileName);
42                     break;
43
44             }

45         }

第二個function則會將要產出的報表檔轉成二進位的型態,方便存到資料庫中,

01         /// <summary>
02         /// 傳入報表路徑、資料與要轉的檔案類型,回傳CR的報表陣列
03         /// </summary>
04         /// <param name="pReportPath">報表路徑(在網站中可用相對路徑,在類別中需要指定實體路徑)</param>
05         /// <param name="pReportData">資料內容</param>
06         /// <param name="pExpertFormatType">要轉出的檔案類型</param>
07         /// <returns>回傳結果的陣列</returns>

08         public byte[] getCrystalReportByte(string pReportPath, DataTable pReportData, ExportFormatType pExpertFormatType)
09         {
10             ReportDocument tCRReportDocument = new ReportDocument();
11
12             //載入該報表
13             tCRReportDocument.Load(pReportPath);
14             //設定資料
15             tCRReportDocument.SetDataSource(pReportData);
16             //將資料內容轉成串流
17             Stream tStream = tCRReportDocument.ExportToStream(pExpertFormatType);
18             byte[] tResult = new byte[tStream.Length];
19             //將串流資料轉成byte[]
20             tStream.Read(tResult, 0, Convert.ToInt32(tStream.Length));
21             tStream.Close();
22
23             return tResult;
24         }

兩種方式都可利用,不過我比較常使用第二種,轉成二進位,一方面方便存到資料庫保存,另一方面也方便直接轉成stream下載到client端來。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。