비주얼스튜디오에 기본내장되어져 있는Microsoft 보고서
라이센스도 무료고 나름 강력한 리포트!
UI 만들기
WPF 에서는 리포트 뷰 따위가 없기때문에 WindowsFormsHost 이용해서 WinFrom 의 컨트롤을 이용한다.
<WindowsFormsHost Name="windowsFormsHost1" Margin="0,46,0,0" />
간지난다!
void MainWindow_Loaded(object sender, RoutedEventArgs e) { ReportViewer reportViewer = new ReportViewer(); reportViewer.ProcessingMode = ProcessingMode.Local; reportViewer.LocalReport.ReportEmbeddedResource = "테스트용.Report2.rdlc"; this.windowsFormsHost1.Child = reportViewer; reportViewer.RefreshReport(); }
바인딩에 사용될 개체
public class Person { public int Age { set; get; } public string Name { set; get; } }
리포트 만들기
Person 개체를 리포트에서 뿌려줄꺼이므로 데이터소스에서 Person을 선택
개체선택
바인딩할려는 대상개체를 선택합니다. 아래와 같이 만들어진다.
보고서 데이터 이거 볼려면 보기 > 보고서 데이터 클릭
매개변수에 바로 접근도 가능
reportViewer.LocalReport.SetParameters(new ReportParameter("Title", "이미지 로드 테스트"));
Person 리스트 만들기
테이블을 끌어서 리포트에 적용.
대략 발로 만들어진 리포트
이상하게 머릿글 입력하는 부분에 직접 Name을 적으면 N a m e 이렇게 글자가 퍼진다 ㅡ_ㅡ
문자를 붙여넣기하면 바로 나옴>
데이터 바인딩하기
위에서 데이터 집합 이름을 DataSet1 으로 선언했따 여기에 List<Person> 담아주면 끗
void MainWindow_Loaded(object sender, RoutedEventArgs e) { ReportViewer reportViewer = new ReportViewer(); reportViewer.ProcessingMode = ProcessingMode.Local; reportViewer.LocalReport.ReportEmbeddedResource = "테스트용.Report2.rdlc"; //데이터 바인딩 List<Person> personList = new List<Person>(); personList.Add(new Person() { Age = 10, Name = "kojaedoo1" }); personList.Add(new Person() { Age = 20, Name = "kojaedoo2" }); personList.Add(new Person() { Age = 30, Name = "kojaedoo3" }); personList.Add(new Person() { Age = 40, Name = "kojaedoo4" }); ReportDataSource personListSource = new ReportDataSource("DataSet1", personList); reportViewer.LocalReport.DataSources.Add(personListSource); this.windowsFormsHost1.Child = reportViewer; reportViewer.RefreshReport(); }
리포트뷰어에서 이미지 출력하기
보고서 데이터에 매개변수를 추가한다. ReportLogo 이게 왼쪽에
이미지가 바인딩된다.
이미지에서 속성보기를 클릭
이미지 원본선택에서 데이터베이스로 선택
필드에서 : =System.Convert.FromBase64String(Parameters!ReportLogo.Value) //ReportLogo는 아까 만든 매개변수이름
MIME 형식사용에서 : image/png
웹클라이언트로 이미지를 받아와서 ToBase64String로 변경한다.
WebClient wc = new WebClient(); Stream imageStream = wc.OpenRead("https://t1.daumcdn.net/cfile/tistory/177612134B839BE557"); string baseLogo = ConvertImageToBase64(System.Drawing.Image.FromStream(imageStream), System.Drawing.Imaging.ImageFormat.Bmp); reportViewer.LocalReport.SetParameters(new ReportParameter("ReportLogo", baseLogo)); //ConvertImageToBase64소스 private string ConvertImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format) { byte[] byteImage; using (System.IO.MemoryStream imageStream = new System.IO.MemoryStream()) { image.Save(imageStream, format); byteImage = new byte[imageStream.Length]; imageStream.Seek(0, System.IO.SeekOrigin.Begin); imageStream.Read(byteImage, 0, (int)imageStream.Length); } return System.Convert.ToBase64String(byteImage); }
전체소스
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Diagnostics; using System.Runtime.InteropServices; using Microsoft.Reporting.WinForms; using System.Net; using System.IO; namespace 테스트용 { /// <summary> /// MainWindow.xaml에 대한 상호 작용 논리 /// </summary> public partial class MainWindow : Window { public MainWindow() { this.Loaded += new RoutedEventHandler(MainWindow_Loaded); } void MainWindow_Loaded(object sender, RoutedEventArgs e) { ReportViewer reportViewer = new ReportViewer(); reportViewer.ProcessingMode = ProcessingMode.Local; reportViewer.LocalReport.ReportEmbeddedResource = "테스트용.Report2.rdlc"; //데이터 바인딩 List<Person> personList = new List<Person>(); personList.Add(new Person() { Age = 10, Name = "kojaedoo1" }); personList.Add(new Person() { Age = 20, Name = "kojaedoo2" }); personList.Add(new Person() { Age = 30, Name = "kojaedoo3" }); personList.Add(new Person() { Age = 40, Name = "kojaedoo4" }); ReportDataSource PersonnelEducation = new ReportDataSource("DataSet1", personList); reportViewer.LocalReport.DataSources.Add(PersonnelEducation); reportViewer.LocalReport.SetParameters(new ReportParameter("Title", "이미지 로드 테스트")); WebClient wc = new WebClient(); Stream imageStream = wc.OpenRead("https://t1.daumcdn.net/cfile/tistory/177612134B839BE557"); string baseLogo = ConvertImageToBase64(System.Drawing.Image.FromStream(imageStream), System.Drawing.Imaging.ImageFormat.Bmp); reportViewer.LocalReport.SetParameters(new ReportParameter("ReportLogo", baseLogo)); this.windowsFormsHost1.Child = reportViewer; reportViewer.RefreshReport(); } private string ConvertImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format) { byte[] byteImage; using (System.IO.MemoryStream imageStream = new System.IO.MemoryStream()) { image.Save(imageStream, format); byteImage = new byte[imageStream.Length]; imageStream.Seek(0, System.IO.SeekOrigin.Begin); imageStream.Read(byteImage, 0, (int)imageStream.Length); } return System.Convert.ToBase64String(byteImage); } } }
끗
더많은 정보
'C#.NET Report' 카테고리의 다른 글
[ReportView / 서브리포트] 포함된 보고서 데이터바인딩 및 파라메터사용하기 (4) | 2011.10.13 |
---|