71

データから簡単なレポートを印刷できるようにする必要がある次のプロジェクトがあります。これはWPFベースであり、どちらに進むべきか疑問に思っています。

WPFは、非常に使いやすい独自の印刷テクノロジ(XPSに基づく)を導入していることを知っています。ただし、ReportViewerコントロールを使用して、Windowsフォームホストコントロールに埋め込む方が、ユーザーがさまざまな形式にエクスポートしたり、印刷したりできるようになるので、もっと簡単かどうか疑問に思っています。

WPFからの印刷/レポートの使用経験はありますか?どちらの方向をお勧めしますか?

4

8 に答える 8

43

RDL の制限

私はもともと、WPF で印刷するために RDLC/ReportViewer を使用していましたが、非常に制限があることがわかりました。私が見つけた制限のいくつかは次のとおりです。

  • RDL は最も退屈なレポートしか作成できませんでした
  • RDL を使用してレポートを作成するのは、そのままの WPF よりもはるかに手間がかかりました。デザイン ツールは、Expression Blend と比較して非常に原始的であり、RDL はテーブルのみを扱います。
  • ControlTemplates、DataTemplates、Styles などを使用する機能がありませんでした
  • レポートのフィールドと列は、データ サイズに基づいて効果的にサイズ変更および再配置できませんでした
  • グラフィックは画像​​としてインポートする必要があり、ベクターとして描画または編集することはできませんでした
  • データ バインディングではなくコード ビハインドが必要なアイテムの配置
  • 変換の欠如
  • 非常に原始的なデータバインディング

WPFから直接印刷するのはとても簡単です

これらの制限があるため、純粋な WPF を使用してレポートを作成することを調べたところ、それは本当に簡単なことであることがわかりました。WPF では、DocumentPaginatorページを生成できる独自のサブクラスを実装できます。

任意の Visual を取得し、ビジュアル ツリーを分析し、選択した要素を非表示にして各ページを作成する単純な DocumentPaginator サブクラスを開発しました。

DocumentPaginator の詳細

初期化中に DocumentPaginator サブクラスが行うことは次のとおりです (最初の PageCount がフェッチされるとき、または最初の GetPage() 呼び出し中に呼び出されます)。

  1. ビジュアル ツリーをスキャンし、ItemsControls 内のすべてのスクロール パネルのマップを作成します。
  2. 一番外側から順に、スクロールしなくても Visual が 1 ページに収まるまで、ItemsControls 内の項目を非表示にします。最も外側のパネルを十分に削減できない場合は、成功するか各レベルでアイテムが 1 つになるまで内側のパネルを削減します。目に見えるアイテムのセットを最初のページとして記録します。
  3. 最初のページに既に表示されている最下位レベルのアイテムを非表示にし、ページに収まらなくなるまで後続のアイテムを表示します。最後に追加された項目を除くすべてを 2 ページ目として記録します。
  4. すべてのページに対してプロセスを繰り返し、結果をデータ構造に保存します。

私の DocumentPaginator の GetPage メソッドは次のとおりです。

  1. 初期化中に生成されたデータ構造で指定されたページ番号を検索します
  2. データ構造に示されているように、ビジュアル ツリー内の項目を表示および非表示にする
  3. PageNumber および NumberOfPages 添付プロパティを設定して、レポートにページ番号を表示できるようにします
  4. Dispatcher ( Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {} ));) をフラッシュして、バックグラウンド レンダリング タスクを完了させます。
  5. VisualBrush が印刷されるビジュアルであるページのサイズの Rectangle を作成します。
  6. 四角形を測定、配置、および UpdateLayout し、それを返します

これは非常に単純なコードであることが判明し、WPF で作成できるほとんどすべてのページをページに変換して印刷することができました。

追加のレポート サポート

ページネーターが機能するようになったので、WPF コンテンツを画面用に作成するのか紙用に作成するのかについてあまり心配する必要がなくなりました。実際、私がデータ入力と編集用に作成した UI は、印刷用にも非常にうまく機能することがよくあります。

そこから、単純なツールバーといくつかのコード ビハインドを追加した結果、RDL よりもはるかに優れた WPF を中心に構築された本格的なレポート システムが完成しました。レポート コードは、ファイルへのエクスポート、プリンターへの印刷、ページ イメージの切り取りと貼り付け、および Excel のデータの切り取りと貼り付けを行うことができます。チェックボックスをクリックして UI を「印刷ビュー」に切り替えて、印刷した場合の外観を確認することもできます。これらすべてが、わずか数百行の C# と XAML で実現されます。

この時点で、私のレポート コードにはない RDL の唯一の機能は、書式設定された Excel スプレッドシートを生成する機能だと思います。これがどのように行われるかはわかりますが、これまでのところその必要はありません。データをカット アンド ペーストするだけで十分です。

私の経験から、ページネーターを作成してから、WPF 自体を使用してレポートを作成することをお勧めします。

于 2010-05-13T20:56:10.627 に答える
25

これと同じ問題があり、今のところ RDLC/ReportViewer を使用することになりました。(私が知っている) ネイティブの WPF レポート ツールはなく、RDLC は非常に使いやすく、無料です。ランタイム オーバーヘッドは小さい (約 2Mb) ですが、.NET Framework の一部ではないため、分散することを忘れないでください。

于 2008-10-08T13:08:40.743 に答える
8

http://wpfreports.codeplex.com/を見てください。

于 2010-05-21T20:37:18.553 に答える
3

PdfReportsを見てください。これはコード ファーストのレポート エンジンであり、iTextSharp および EPPlus ライブラリの上に構築されています。.NET 3.5 以降の Web アプリケーションと Windows アプリケーションの両方と互換性があります。

于 2012-10-09T10:28:40.303 に答える
3

スクライバーはどうですか?xml を使用して PDF レポート テンプレートを定義し、実行時にアプリケーション内のデータにバインドできます。http://scryber.codeplex.com/

于 2013-04-24T18:40:55.310 に答える
2

Ray Burnsの回答について詳しく説明するには、実装例を探している場合は、「 カスタムデータグリッドドキュメントページャー」を参照してください。

これは素晴らしい出発点です。

于 2012-12-07T00:20:28.207 に答える
1

私は最近、基本的に設計環境とデータソースマネージャーで構成される独自のレポートシステムを開発するというタスクを完了しました。最初のタスクは、WYSWIG のようなデザイン環境を開発することでした。印刷/印刷プレビューの生成は予想よりも簡単だったので、印刷を気にせずにGDI +を使用してこれを行いました。一般に、印刷イベントのグラフィックスオブジェクトに画面上のすべてのものを描画するだけで済みます。

WPFの場合も同様だと思いますので、心配する必要があるのは、レポートを画面に表示することだけで、印刷は数行のコードで済みます。

于 2008-10-08T12:29:57.670 に答える
0

WPF の将来に関する政治的な議論に入るまでもなく、私たちが見つけた最良の選択肢は、ReportViewer を Windows フォーム ホスト コントロールにラップすることでした。

http://blog.pineywoodstech.com/index.php/2012/01/using-microsoft-reportviewer-with-wpf/

于 2012-07-17T18:39:46.373 に答える