2008-10-07 21 views
65

Tengo un próximo proyecto que deberá poder imprimir informes simples a partir de sus datos. Estará basado en WPF, y me pregunto qué camino tomar.¿Cuál es el mejor enfoque para imprimir/informar desde WPF?

Sé que WPF presenta su propia tecnología de impresión (basada en XPS) que parece bastante fácil de usar. Sin embargo, una parte de mí se pregunta si simplemente sería más fácil usar el control ReportViewer e incrustarlo en un control de host de Windows Forms, ya que eso les dará a los usuarios la capacidad de exportar a una variedad de formatos además de imprimir.

¿Alguien ha tenido alguna experiencia con la impresión/informe de WPF? ¿Qué dirección recomendarías?

+0

[SimpleWPFReporting] (https://github.com/maximcus/SimpleWPFReporting) le da la capacidad de crear cualquier informe con toda la potencia de WPF XAML. SimpleWPFReporting se ocupará de exportarlo como PDF o imprimirlo. –

Respuesta

23

Tuvimos este mismo problema y terminamos usando RDLC/ReportViewer por el momento. No hay una herramienta nativa de informes de WPF (que yo sepa) y RDLC es bastante simple de usar, y es gratis. La sobrecarga de tiempo de ejecución para él es pequeña (alrededor de 2Mb) pero debe recordar distribuirlo ya que no forma parte de .NET Framework.

0

He realizado recientemente la tarea de desarrollar mi propio sistema de informes, que básicamente consiste en el entorno de diseño y el administrador de fuente de datos. La primera tarea fue desarrollar el entorno de diseño WYSWIG. He hecho esto usando GDI +, sin siquiera molestarme con la impresión, ya que salió imprimiendo/generando la vista previa de impresión fue más fácil de lo que esperaba, en general solo se necesita dibujar todo en la pantalla al objeto gráfico del evento de impresión.

Creo que en el caso de WPF sería similar, por lo que todo lo que debe preocuparse es mostrar su informe en la pantalla y la impresión sería de pocas líneas de código.

38

Limitaciones del RDL

que originalmente fue con RDLC/ReportViewer para imprimir con WPF, pero lo encontraron muy limitante. Algunas de las limitaciones que encontré fueron:

  • RDL sólo podía crear el más aburrido de los informes
  • era mucho más trabajo para crear un informe mediante el RDL que en WPF recta: Las herramientas de diseño son muy primitivas en comparación con Expression Blend y ofertas RDL solamente en cuadros
  • no tenía la capacidad de utilizar ControlTemplates, DataTemplates, estilos, etc
  • Mi informe campos y columnas no podía cambiar el tamaño y reorganizar de manera efectiva en función del tamaño de datos
  • Gráficos tenía para ser importado como imágenes - no pudo b e dibujado o editados como vectores
  • Posicionamiento de los elementos necesarios de código subyacente en lugar de unión a
  • La falta de transformaciones de datos
  • vinculantes

Impresión directa desde WPF datos muy primitiva es muy fácil

Debido a estas limitaciones busqué crear informes usando WPF puro y descubrí que era realmente bastante trivial. WPF le permite implementar su propia subclase DocumentPaginator que puede generar páginas.

Desarrollé una subclase DocumentPaginator simple que toma cualquier Visual, analiza el árbol visual y oculta los elementos seleccionados para crear cada página.

detalles DocumentPaginator

Esto es lo que hace mi DocumentPaginator subclase durante la inicialización (llamados cuando primero PageCount es capturada, o durante el primer getPage() llamada):

  1. Escanea el árbol visual y crea un mapa de todos los paneles desplazados dentro de ItemsControls
  2. Empezando por el más externo, hace que los elementos en los ItemsControls sean invisibles hasta que el Visual se ajuste a una sola página sin necesidad de desplazarse. Si el más externo no se puede reducir lo suficiente, reduce los paneles internos hasta que tenga éxito o solo tenga un elemento en cada nivel. Registre el conjunto de elementos visibles como la primera página.
  3. Oculte los elementos de nivel más bajo que ya se han mostrado en la primera página, luego haga visibles los elementos subsiguientes hasta que ya no quepan en la página. Grabe todo, excepto el último elemento agregado como la segunda página.
  4. Repita el proceso para todas las páginas, almacenando los resultados en una estructura de datos.

método getPage de mi DocumentPaginator es el siguiente:

  1. Busque el número de página que figura en la estructura de datos generados durante la inicialización
  2. Ocultar y mostrar elementos en el árbol visual como se indica en la estructura de datos
  3. propiedades
  4. Conjunto PageNumber y NumberOfPages adjuntos lo que el informe puede mostrar la página de numeración
  5. a eliminar el despachador (Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {}));) para conseguir cualquier tarea en segundo plano de representación s para completar
  6. crear un rectángulo del tamaño de la página cuyo VisualBrush es el ser visual impresa
  7. Medida, organizar y UpdateLayout del rectángulo, después lo devuelve

Esto resultó ser un código muy sencillo , y me permitió convertir prácticamente todo lo que pudiera crear con WPF en páginas e imprimirlo.

apoyo adicional de informes

Ahora que mi paginador está trabajando, ya no tienen que preocuparse mucho acerca de si estoy creando mi contenido de WPF para la pantalla o papel. De hecho, a menudo la interfaz de usuario que construyo para la entrada y edición de datos también funciona muy bien para la impresión.

A partir de ahí agregué una barra de herramientas simple y un código detrás, lo que resultó en un sistema completo de creación de informes basado en WPF que era mucho más capaz que RDL. Mi código de informe puede exportar a archivos, imprimir a la impresora, cortar/pegar imágenes de página y cortar/pegar datos para Excel. También puedo cambiar cualquiera de mi interfaz de usuario a "vista de impresión" con un clic en una casilla de verificación para ver cómo se verá si se imprime. ¡Todo esto en solo unos cientos de líneas de C# y XAML!

En este momento, creo que la única característica RDL que tiene mi código de informe no es la capacidad de generar una hoja de cálculo Excel formateada. Puedo ver cómo se podría hacer esto, pero hasta ahora no ha sido necesario, cortar y pegar solo los datos ha sido suficiente.

Desde mi experiencia, mi recomendación sería escribir un paginador, luego comenzar a usar WPF para crear sus informes.

+5

Muy interesante ya que estoy pensando en eliminar RDLC. ¿Ha publicado alguno de los códigos de su paginador de documentos? –

+0

No a partir de este momento. –

+2

¿Podría ampliar esto en absoluto? Tal vez con algunos ejemplos de código corto/xaml? –

8
+0

encontré un [artikel] (http://www.nullskull.com/a/1426/wpf-report-engine -part-1.aspx) en nullskull que explica paso a paso cómo crear un motor de informes WPF utilizando el mismo enfoque. – WiiMaxx

2

Tome un vistazo a PdfReports. Es un motor de informes por código, que se basa en las bibliotecas iTextSharp y EPPlus. Es compatible con aplicaciones .NET 3.5+ Web y Windows.

1

¿Qué tal Scryber? Permite que las plantillas de informes PDF se definan utilizando xml y se vinculen a los datos de su aplicación en tiempo de ejecución. http://scryber.codeplex.com/

Cuestiones relacionadas