miércoles, 22 de febrero de 2017

WPF Copy/Paste Excel Fácil




He desarrollado una forma sencilla de copy y pegar datos entre Excel y una aplicación WPF. Este código es compatible con controles que heredan de System.Windows.Control.ItemsControls, ósea que poseen la propiedad ItemsSource. Algunos de estos controles son DataGrid, ListBox, ListView, etc.

Es de código abierto y su código está en GitHub.

Su uso es extremadamente sencillo y se puede instalar fácilmente desde nuget. Una vez instalado simplemente configuraremos un import en el XAML y unas AttachProperties en el control en cuestión.






Así trabaja:










Prerequisitos

Esta utilidad ha sido testeada en aplicaciones WPF, no se ha probado en aplicaciones (Silverlight, WP or WUP).
Es compatible con la versión 4.5.2 NET Framework o posterior.





Instalación

Instalaremos desde nuget:



















Configuración

Después de que la instalación haya sido completada comonfiguraremos nuestra Window WPF , añadiremos el siguiente import al código XAML:


xmlns:ml="clr-namespace:MoralesLarios.Utilities.Excel;assembly=MoralesLarios.Utilities"

Añadiremos las siguientes propiedades al ItemsControl en  XAML:



<DataGrid x:Name="dataGrid" 
          ml:ExcelActions.EnabledCopyExcel ="True"  <!- enabled copy/copiall excel  -->
          ml:ExcelActions.EnabledPasteExcel="True"  <!- enabled paste        excel  -->
          />



Este simple código habilita el copy / paste entre Excel y un objeto DataGrid.

































Al realizar una configuración tan simple, será necesario realizar las acciones de copy/paste mediante combinaciones de teclado:

  • Ctrol + A à CopyAll            à Copia todos los registros
  • Ctrol + C à Copy Selected   à Copia los registros seleccionados.
  • Ctrol + P à Paste                  à Pega los datos en el ItemsSource.




Otras AttachProperties

Iremos añadiendo funcionalidad con otras AttachProperties:


ml:ExcelActions.EnabledCopyExcel  ="True" 
ml:ExcelActions.EnabledPasteExcel ="True" 
ml:ExcelActions.ContainsHeader    ="False"
ml:ExcelActions.CreateContextMenu ="True"
ml:ExcelActions.CancelWithErrors  ="False"
ml:ExcelActions.PaintFlash        ="True"
ml:ExcelActions.ColorFlash        ="Yellow"
ml:ExcelActions.ShowErrorMessages ="True"


CreateContextMenu

Habilita o deshabilita el menu contextual en el objeto ItemsControl.

ml:ExcelActions.CreateContextMenu="True"

True es su valor por defecto.

















ContainsHeader


Habilita o deshabilita el copiado de las cabeceras.

ml:ExcelActions.ContainsHeader="False"

True es su valor por defecto.

























PaintFlash

Muestra u oculta el destello de color que ocurre en el control cuando se realiza una operación de copiado o pegado.

ml:ExcelActions.PaintFlash="True"

True es el valor por defecto.





































ColorFlash

Configura el color del destello de la acción de copy/paste (es solo visible cuando la propiedad PaintFlash está configurada a True).


ml:ExcelActions.ColorFlash="Yellow"

Bruhes.Gray es su valor por defecto.



ShowErrorMessages

Esta propiedad especifica si se muestra o no un mensaje de error, cuando ocurre alguna excepción en la creación de alguna columna en la acción de paste. Normalmente esto ocurre, cuando los datos copiados de Excel, no son suficientes, o no son compatibles con el tipo de datos del ItemsSource del ItemsControl.

ml:ExcelActions.ShowErrorMessages="True"


True es su valor por defecto.




























En movimiento:




































CancelWithErrors

Cuando copiamos varias filas de un Excel y alguna de estas no produce un error, esta propiedad especifica si se pegan los registros válidos, o por el contrario no se pega ningún dato.

  • True à Pega los registros correctos
  • False à No pega nada.
  • True es el valor por defecto.






































Recomendaciones

Para un correcto funcionamiento de pegado, es necesario que el tipo de datos de la propiedad ItemsSource del ItemsControl sea ObservableCollection, ya que es la forma de que en la acción de pegado los registros se refresquen sin contratiempos.

Limitaciones

Esta versión solo da soporte a la acción de inserción en el pegado de datos, por lo que no actualiza registros, o completa parte de filas del control WPF.

Si tiene éxito y alguien lo necesita, que me lo pida y actualizaré la librería con esta funcionalidad.