WPF에서 인쇄/보고하는 가장 좋은 방법은 무엇입니까?
데이터로부터 간단한 리포트를 인쇄할 수 있는 프로젝트가 있습니다.WPF 기반인데 어느 쪽으로 가야 할지 고민이에요.
WPF는 독자적인 인쇄 기술(XPS 베이스)을 도입하고 있어 사용하기 쉬울 것 같습니다.다만, ReportViewer 컨트롤을 사용해 Windows Forms 호스트 컨트롤에 짜넣는 것이, 유저에게 인쇄 뿐만이 아니라 다양한 포맷으로 export 할 수 있도록 하는 것이 더 쉬울까 하는 생각도 듭니다.
WPF에서 인쇄/보고를 한 경험이 있는 사람이 있습니까?어느 방향을 추천하시겠습니까?
RDL의 제한
원래는 WPF를 사용한 인쇄를 위해 RDLC/ReportViewer를 사용했지만 매우 제한적이었습니다.다음과 같은 제한이 있었습니다.
- RDL은 가장 지루한 보고서만 생성할 수 있습니다.
- RDL을 사용하여 보고서를 작성하는 작업은 일반 WPF보다 훨씬 더 많이 수행되었습니다.Expression Blend와 RDL은 표에서만 취급하는 것에 비해 설계 도구는 매우 원시적입니다.
- ControlTemplates, DataTemplates, Styles 등을 사용할 수 없었습니다.
- 보고서 필드와 열이 데이터 크기에 따라 효과적으로 크기를 조정하고 재배치할 수 없음
- 그래픽스를 이미지로 Import해야 했습니다.그래픽을 벡터로 그리거나 편집할 수 없습니다.
- 데이터 바인딩이 아닌 코드 배후에 필요한 항목의 위치 설정
- 변환의 결여
- 매우 원시적인 데이터 바인딩
WPF에서 직접 인쇄하는 것은 매우 간단합니다.
이러한 제한 때문에 순수 WPF를 사용한 보고서 작성을 검토해보니 매우 사소한 일이었습니다.WPF 를 하면, 인 WPF 를 수 .DocumentPaginator★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
저는 간단한 Document Paginator 서브클래스를 개발했습니다.이 서브클래스는 임의의 Visual을 사용하여 해석하고 선택한 요소를 숨겨 각 페이지를 만듭니다.
Document Paginator 상세
다음으로 초기화 중(첫 번째 PageCount가 Import되었을 때 또는 첫 번째 GetPage() 호출 중) DocumentPaginator 서브클래스의 동작을 나타냅니다.
- 시각적 트리를 스캔하고 항목 컨트롤 내부에 스크롤된 모든 패널의 지도를 만듭니다.
- 맨 바깥쪽부터 시작하여 ItemsControls의 항목을 스크롤할 필요 없이 Visual이 한 페이지에 들어갈 때까지 맨 마지막에 보이지 않게 만듭니다.가장 바깥쪽을 충분히 줄일 수 없는 경우 성공하거나 각 레벨에 항목이 하나만 있을 때까지 내부 패널을 줄입니다.표시되는 항목 세트를 첫 페이지로 기록합니다.
- 첫 번째 페이지에 이미 표시된 가장 낮은 수준의 항목을 숨긴 다음 페이지에 더 이상 맞지 않을 때까지 후속 항목을 표시합니다.마지막으로 추가한 항목을 제외한 모든 항목을 두 번째 페이지로 기록합니다.
- 모든 페이지에 대해 이 과정을 반복하여 결과를 데이터 구조에 저장합니다.
My Document Paginator의 Get Page 메서드는 다음과 같습니다.
- 초기화 시 생성된 데이터 구조에서 지정된 페이지 번호를 조회합니다.
- 데이터 구조에 표시된 대로 시각적 트리의 항목 숨기기 및 표시
- 보고서에 페이지 번호를 표시할 수 있도록 Page Number 및 Number Of Pages 첨부 속성을 설정합니다.
- (디스패처를 플래시합니다.
Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {} ));하려면 , 를 사용합니다. - VisualBrush가 인쇄되는 비주얼인 페이지 크기의 직사각형 만들기
- 측정, 배열 및 업데이트사각형 레이아웃 후 반환
이것은 매우 간단한 코드로 판명되었고, WPF로 만들 수 있는 거의 모든 것을 페이지로 변환하여 인쇄할 수 있게 되었습니다.
추가 보고서 지원
페이지 매니저가 일을 하고 있기 때문에, WPF 컨텐츠를 스크린용으로 작성할지, 종이로 작성할지 고민할 필요가 없어졌습니다.실제로 데이터 입력 및 편집을 위해 작성하는 UI도 인쇄에 매우 적합합니다.
그 후 간단한 툴바와 코드를 추가하여 WPF를 기반으로 한 완전한 보고서 시스템을 구축했습니다.이 시스템은 RDL보다 훨씬 뛰어난 성능을 발휘합니다.리포트 코드를 사용하여 파일 내보내기, 프린터 인쇄, 페이지 이미지 잘라내기/붙여넣기, Excel 데이터 잘라내기/붙여넣기 등을 할 수 있습니다.또, 체크 박스를 클릭하는 것만으로, UI 를 「인쇄 표시」로 전환할 수 있습니다.이 모든 것을 C#과 XAML의 수백 줄에!
현시점에서는 RDL에 없는 유일한 기능은 포맷된 Excel 스프레드시트를 생성하는 기능이라고 생각합니다.어떻게 할 수 있는지 알 수 있지만, 지금까지는 데이터를 잘라내고 붙여넣는 것만으로 충분했습니다.
제 경험상 권장되는 것은 페이지 작성자를 작성한 후 WPF 자체를 사용하여 보고서를 작성하는 것입니다.
같은 문제가 발생하여 현재는 RDLC/ReportViewer를 사용하고 있습니다.네이티브 WPF 리포트 툴은 없습니다(제가 아는 바로는).또한 RDLC는 매우 사용하기 쉽고 무료입니다.의 런타임 오버헤드는 작지만(약 2Mb), 의 일부가 아니므로 배포해야 합니다.NET 프레임워크
http://wpfreports.codeplex.com/ 를 참조해 주세요.
PdfReports 를 봐 주세요.코드 퍼스트 리포트 엔진으로 iTextSharp 및 EPplus 라이브러리를 기반으로 구축되어 있습니다.양쪽 모두에 대응하고 있습니다.NET 3.5 이상의 Web 및 Windows 애플리케이션.
스크라이버는 어때?PDF 보고서 템플릿을 xml을 사용하여 정의하고 런타임에 응용 프로그램 내의 데이터에 바인딩할 수 있습니다.http://scryber.codeplex.com/
구현 예를 찾고 있는 경우 Ray Burns 답변에 대한 자세한 내용은 Custom Data Grid Document Paginator를 참조하십시오.
그게 좋은 출발점이야
저는 기본적으로 설계 환경과 데이터 소스 매니저를 기반으로 하는 자체 보고서 시스템 개발 작업을 성실히 수행했습니다.첫 번째 과제는 WYSWIG와 같은 디자인 환경을 개발하는 것이었다.GDI+를 사용해 인쇄에 신경 쓰지 않고 인쇄/생성 미리보기가 생각보다 쉬웠기 때문에 일반적으로 인쇄 이벤트의 그래픽 오브젝트에 화면상의 모든 것을 그리는 것만으로 충분합니다.
WPF의 경우도 비슷하다고 생각하기 때문에, 화면에 리포트를 표시하고, 인쇄하는 것은 코드 몇 줄뿐입니다.
WPF의 장래에 대해 정치적인 논의를 하지 않고 ReportViewer를 Windows Forms 호스트 컨트롤로 랩하는 것이 최선의 선택이었습니다.
http://blog.pineywoodstech.com/index.php/2012/01/using-microsoft-reportviewer-with-wpf/
언급URL : https://stackoverflow.com/questions/180746/whats-the-best-approach-to-printing-reporting-from-wpf
'source' 카테고리의 다른 글
| WPF 데이터 그리드의 셀 편집을 디세블로 하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
|---|---|
| 큰(거대, 거대, 거대) 텍스트 파일을 여는 텍스트 편집기 (0) | 2023.04.13 |
| 되돌린 Git 커밋을 "반환"하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
| Git에서 porcelain이라는 용어는 무엇을 의미합니까? (0) | 2023.04.13 |
| 피쳐 분기 기본 재배치 후 Git 푸시가 거부되었습니다. (0) | 2023.04.13 |