Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

miércoles, 9 de abril de 2008

Google Docs y Microsoft Office 2007

Google proporciona, mediante sus proyectos de código (Google Code), todo tipo de herramientas, algunas de las cuales nos permiten interactuar con sus productos, como puede ser el correo, documentos o calendario. Entre ellas, se encuentra la .NET Library for the Google Data API, dentro de .NET Client Library. Mediante el uso de esta biblioteca de clases podemos desarrollar aplicaciones .NET que puedan acceder a los recursos de Google. Sin embargo, se trata de una biblioteca programada inicialmente sobre el .NET Framework 1.1, ya obsoleto, aunque es posible obtener el código y recompilarlo para el Framework 2.0, por lo que sería posible usarlo con Visual Studio 2005 y 2008.


En cualquier caso, hoy quería mostrar cómo interactuar de una forma sencilla y unilateral con Google Docs a través del correo electrónico. Google Docs, la aplicación web para la gestión de documentos (hojas de cálculo, documentos de texto y presentaciones), permite la edición en línea de los documentos, así como la conversión entre distintos formatos (tanto exportación como importación). Así, a la hora de incluir un nuevo documento, podemos crearlo directamente on-line, o subir uno que ya tengamos creado con aplicaciones del tipo de OpenOffice Writer o Microsoft Word. Sin embargo, existe una posibilidad interesante y poco usada que consiste en enviar el documento por correo electrónico, bien como documento adjunto al mismo, bien dentro del propio cuerpo del mensaje. La dirección a la que debemos enviarlo nos la proporciona el propio Google Docs en su opción Upload, y suele ser del tipo "Nombre+Del+Usuario-listadenumeros @prod.writely.com". Aunque no es la forma más elegante ni eficiente para disfrutar de las posibilidades de Google Docs, nos va a servir para unir dos proyectos presentados en Lobosoft y conseguir un sencillo método para hacer una copia de seguridad de un documento de Microsoft Word 2007 en Google Docs. Microsoft y Google juntos, ¿da miedo, verdad?


El proceso no puede ser más sencillo. Creamos un nuevo proyecto de Visual Studio 2008 del tipo Office 2007-Word 2007 Add-in. Añadimos al proyecto un nuevo Ribbon, mediante el mismo proceso que seguimos en su día en la entrada de aproximación a Visual Studio Tools for Office (VSTO v3). A continuación, añadimos la funcionalidad de envío de correo que creamos en el post sobre el envío de correos mediante Gmail y C#. Lo ideal sería, cuando tuviésemos la funcionalidad de envío y recepción de correo completa, crear un nuevo componente que pudiésemos reutilizar en nuestros proyectos, pero por la sencillez del ejemplo, simplemente traemos la clase Lobosoft.Outgleek.Mail al proyecto, y nos disponemos a usarla.


pestania.PNG


Y lo novedoso viene ahora. Simplemente debemos añadir un botón al RibbonGroup que ejecute el envío del correo. En el ejemplo, además, he incluido un pequeño TextBox donde insertar la dirección de correo a la que deseamos enviar el documento (y que será, presumiblemente, la que nos proporcionó Google Docs). En un proyecto mayor, esto podría ser configurable desde algún punto de la aplicación, al igual que los parámetros de la cuenta de correo de Gmail, y el propio servidor de correo, que usaremos para llevar a cabo el envío.


opciones.PNG


El código asociado al botón Save to Docs será el siguiente:

[csharp]
private void SaveToDocs_Click(object sender, RibbonControlEventArgs e)
{
Mail newMail = new Mail();
newMail.SendMail(editBox1.Text, DocumentManagement.DocumentName, DocumentManagement.GetText());
}
[/csharp]

Y llevará a cabo un par de acciones: recuperar el nombre del documento, a través de la clase DocumentManagement, que habremos creado a tal efecto, y el texto del documento en un formato apropiado. La recuperación del texto del documento tiene su miga, ya que (al menos hasta donde llegan mis conocimientos actuales de la jerarquía del objeto Document de Interop.Word.Document, no es trivial recuperar todo el texto y el formato del documento. Para hacerlo hemos recurrido a un pequeño truco. Usar el método Select() de la clase Document para seleccionar todo el documento para, posteriormente, copiarlo al portapapeles mediante el método Copy() de Interop.Word.Selection. A partir de aquí, volvemos a pedir al portapapeles (Clipboard) el texto del documento, indicándome mediante el parámetro format, del tipo TextDataFormat, el formato en que deseamos que nos lo devuelva, en este caso HTML.



[csharp]
public static string GetText()
{
try
{
Word.Document myDocument = Globals.ThisAddIn.Application.ActiveDocument;
myDocument.Select();
Globals.ThisAddIn.Application.Selection.Copy();
return Clipboard.GetText(TextDataFormat.Html);
}
catch (Exception ex)
{
throw ex;
}
}
[/csharp]

El documento que vamos a almacenar en Google Docs es el siguiente:


documento.PNG


Hecho esto, procedemos a enviar el correo a Google Docs, con el nombre del documento por Asunto, ya que este campo le indicará el nombre que debe dar al documento remoto, y el HTML del documento en el cuerpo del mensaje.


Accedemos a Google Docs para ver que, en efecto, un nuevo documento ha sido creado.


engoogledocs.PNG


Sin embargo, los resultados están a la vista, y la conversión a HTML que lleva a cabo el método GetText() del Clipboard no es del todo compatible con Google Docs.


eldocumentofinal.PNG


Por tanto, aunque resulta un método extremadamente simple para realizar un backup de nuestros documentos en Google Docs, no es todo lo adecuado que debería. No nos quedará más remedio, pues, que volver a compilar y adaptar el código de la .NET Client Library a los Frameworks 2.0 ó 3.5 de .NET.

1 comentario: