Este artículo proviene de un motor de traducción automática.

Servicios de Office

La combinación de documentos de Word en el lado servidor con SharePoint 2010

Ankush Bhatia

Descargar el ejemplo de código

A menudo, los desarrolladores de aplicaciones de negocio deben crear las soluciones que automatizan las actividades diarias para sus organizaciones.Por lo general, estas actividades incluyen procesamiento y la manipulación de datos en diversos documentos, por ejemplo, extraer y consolidar los datos de varios documentos de origen, la combinación de datos en los mensajes de correo electrónico, buscar y reemplazar contenido en los documentos, volver a calcular los datos de libros, extraer las imágenes de presentaciones...y la lista continúa y en.

Microsoft Office simplifica, ya que proporciona una API enriquecida que los programadores pueden utilizar para automatizar estos tipos de tareas repetitivas.Debido a que estas soluciones funcionan sin problemas para los usuarios de escritorio normales, los desarrolladores han tenido en el siguiente nivel: implementación de las soluciones a los servidores que proporcionan una ubicación central desde donde se pueden solucionar todo este trabajo repetitivo para varios usuarios sin la intervención humana.

Aunque mover las soluciones que completan tareas repetitivas de Office desde el escritorio a un servidor parece sencillo, no es bastante tan sencillo como parece.

Microsoft diseñó el conjunto de aplicaciones de Office para los escenarios de equipo de escritorio que un usuario inicia sesión en un equipo y está sentado delante de él.Por motivos de seguridad, rendimiento y confiabilidad, las aplicaciones de Office no son las herramientas adecuadas para escenarios de servidor.Las aplicaciones de Office en un entorno de servidor pueden requerir intervención manual y que no es óptimo para una solución de servidor.Microsoft recomienda evitar este tipo de solución, tal como se explica en el artículo de soporte técnico de Microsoft, “ Consideraciones para la automatización de Office en el servidor de ”.

Desde el lanzamiento de 2007 Office, sin embargo, la historia de la automatización de Office ha cambiado mucho.Con Microsoft de Office 2007 introdujo OpenXML de Office y Excel Services para desarrolladores que deseen desarrollar soluciones basadas en Office en el servidor.

Con Office 2010 y 2010 de SharePoint, Microsoft ha idear un nuevo conjunto de componentes que se llama a servicios de aplicaciones.Éstos poner un amplio conjunto de herramientas en la bolsa de un desarrollador de soluciones de automatización de Office.Los servicios de aplicación incluyen Excel Services, servicios de automatización de Word, InfoPath Forms Services, servicios de PerformancePoint Server y servicios de Visio.Puede obtener más información acerca de los detalles de estos servicios en msdn.microsoft.com/library/ee559367(v=office.14) de .

En este artículo, le mostraremos cómo usar OpenXML de Office, los servicios de automatización de Word y SharePoint para crear una aplicación sencilla que combina los informes de estado independiente en un solo documento.

Flujo de trabajo de informe de estado

Let’s dicen que eres un desarrollador que trabaja en una compañía orientada a servicios en el que se administran varios proyectos por diferentes equipos.Cada semana, cada jefe de proyecto utiliza una plantilla común para crear un informe de estado semanal y cargarlo en un repositorio de SharePoint interno.Ahora obtener un informe consolidado que contendrá todos estos informes de estado semanal y, sabe qué desea que el Administrador de grupo, es el elegido usuario tiene que implementar este requisito.

Tiene suerte, no obstante.Como mencionamos anteriormente, su vida es más fácil en la actualidad debido a que se puede implementar este requisito con mucho menos esfuerzo mediante OpenXML y servicios de automatización de Word.Podrá obtener una solución más sólida y estable de los que no se puede tener sin estas tecnologías.

Let’s para iniciar la visualización de la solución.La figura 1, se muestra un flujo de trabajo propuesto.El proceso se inicia con los jefes de proyecto individuales rellenar los informes de estado y cargarlos en el servidor de SharePoint.El Administrador de grupo, a continuación, puede iniciar el proceso de combinación de los informes que se almacenan en el servidor y generar un informe combinado.

Figure 1 Workflow for Generating a Status Report

Figura 1 de flujo de trabajo para un estado de generación de informes

Crear una plantilla

Para implementar esta solución, el primer paso es proporcionar una plantilla común a todos los jefes de proyecto para rellenar los informes de estado semanal.Cuando termine de rellenar los datos, podrá cargar los informes a un repositorio de SharePoint.El lunes por la mañana, el Administrador de grupo puede, a continuación, inicie sesión en el sitio de SharePoint y activar la lógica que lleva a cabo las tareas siguientes:

  1. Lee todo el estado individual de documentos del informe.
  2. Combina en un único informe.
  3. Guarda el informe en el repositorio para los usuarios tengan acceso.

La figura 2 muestra lo que la plantilla de informe de estado aspecto tendrá (let’s llamarlo WeeklyStatusReport.dotx).Como puede observar, la plantilla incluye campos para capturar un título, las fechas, nombre del jefe de proyecto, hitos y datos asociados y los campos de texto para escribir la información acerca de problemas, los planes futuros y logros.En este caso hemos utilizado el control de selector de fecha y de los campos de texto por motivos de simplicidad, pero no se puede utilizar fácilmente listas desplegables, casillas de verificación o una gran variedad de otros controles para simplificar la entrada de datos.

Figure 2 Weekly Status Report Template

La figura 2 de plantilla de informe de estado semanal

La biblioteca de documentos

El siguiente paso es crear una biblioteca de documentos personalizada que aloja los informes de estado semanal en función de esta plantilla.

En el panel de exploración de SharePoint, haga clic en las bibliotecas y, a continuación, crear para crear una nueva biblioteca.En el cuadro de diálogo Crear filtrar por la biblioteca, seleccione la biblioteca de documentos y escriba un nombre para la biblioteca (utilizamos WSR Library).Ahora, haga clic en crear.

Ahora tiene que crear un tipo de contenido para la nueva biblioteca.Haga clic en acciones del sitio, a continuación, en configuración del sitio y, en la sección Galerías, haga clic en tipos de contenido de sitio.Haga clic en crear y, a continuación, escriba un nombre para el tipo de contenido (se utiliza el informe de estado semanal).

En la lista Seleccionar Parent Content Type de, seleccione los tipos de contenido de documento.En la lista Tipo de contenido de la matriz, seleccione el documento y haga clic en Aceptar.

En configuración, seleccione la configuración avanzada, a continuación, elija el botón de opción “ actualizar una nueva plantilla de documento ” y haga clic en Examinar.Busque la plantilla de informe (WeeklyStatusReport.dotx) y cargarlo en la biblioteca.

A continuación, vaya a la biblioteca de WSR y seleccione la configuración de la biblioteca.En Configuración General, seleccione la configuración avanzada.Seleccione Sí para “ permitir la administración de los tipos de contenido ”, a continuación, haga clic en Aceptar.

Verá una lista de tipos de contenido que se muestra en la página de configuración de la biblioteca.Seleccione el vínculo “ Agregar desde Existing Site Content Types ”.Seleccione el tipo de contenido que creó anteriormente en la lista de tipos de contenido de sitio disponibles.En mi ejemplo, se trata de informe de estado semanal.Haga clic en Agregar y haga clic en Aceptar.

De nuevo en la lista de tipos de contenido, haga clic en el documento y seleccione “ Eliminar este tipo de contenido. ” Seleccione Aceptar en el cuadro de mensaje de advertencia.

Ahora debería ver el tipo de contenido cuando se selecciona un nuevo documento en la biblioteca WSR, tal como se muestra en de figura 3.

Figure 3 Selecting the Custom Content TypeLa figura 3 de Seleccionar el tipo de contenido personalizado

En este momento puede seguir adelante y agregar un par de informes de estado a la biblioteca de documentos.

Crear el elemento Web

A continuación, tiene que habilitar a un administrador de grupo para iniciar la lógica de consolidación.Puede hacerlo a través de un botón en la parte inferior de la vista predeterminada de la biblioteca de documentos.

Hay dos pasos implicados aquí.En primer lugar, va a crear un elemento Web de Visual con Visual Studio de 2010.En segundo lugar, va a agregar el elemento Web a la biblioteca de documentos mediante SharePoint Designer 2010.

Para crear un elemento Web personalizado, inicie un nuevo proyecto de Visual Studio de 2010 mediante la plantilla de proyecto de elemento Web de Visual.Asigne al proyecto un nombre como, por ejemplo, DocumentMerge, a continuación, haga clic en Aceptar.

En la página del Asistente para personalización de SharePoint, seleccione la aplicación Web (la dirección URL al sitio de SharePoint que aloja la biblioteca de documentos), a continuación, haga clic en Finalizar.

Una vez creado el proyecto, abra el archivo VisualWebPart1.cs y modifique el método CreateChildControls con el código siguiente:

protected override void CreateChildControls() {
  Control control = Page.LoadControl(_ascxPath);
  Controls.Add(control);
  base.CreateChildControls();
  Button btnSubmit = new Button();
  btnSubmit.Text = "Merge Reports";
  btnSubmit.Click += new EventHandler(OnSubmitClick);
  Controls.Add(btnSubmit);
}

También puede agregar un controlador de eventos para el clic del botón:

void OnSubmitClick(object sender, EventArgs e) {
  // TODO : Put code to merge documents here
}

En este momento puede generar y distribuir el proyecto. Agregaremos la implementación en nuestro controlador OnSubmitClick un poco más adelante en este artículo.

El siguiente paso es agregar el elemento Web a la biblioteca de documentos. En SharePoint Designer de 2010, abra el sitio de SharePoint. Haga clic en todos los archivos | WSR biblioteca | formularios (Forms), haga clic en AllItems.aspx para modificarlo.

Haga clic en la parte inferior de la página. Haga clic en Insertar | componente Web y, a continuación, seleccione elementos Web más. En el cuadro de búsqueda, escriba VisualWebPart (el nombre del elemento Web que acaba de crea y implementado) y haga clic en Aceptar (consulte de figura 4). La figura 5, se muestra la página con el elemento Web en su lugar. Guarde la página y cierre SharePoint Designer.

Figure 4 Inserting the Web Part

La figura 4 de Insertar el elemento Web

Figure 5 The Web Part in Place on the Page

La figura 5 de los elementos Web en lugar de la página.

La combinación de los informes

Ahora, let’s agregar la lógica para combinar los documentos cargados en la biblioteca de documentos. Por motivos de simplicidad, este código combinará todos los documentos que se cargan en esta carpeta en un solo archivo. Sería un enfoque más realista combinar sólo los elementos seleccionados o sólo los elementos que se cargan en un período de tiempo especificado. También puede guardar el documento combinado a una ubicación diferente o una biblioteca diferente. Esto es cuando se va a agregar la implementación a nuestro controlador OnSubmitClick de nuestro proyecto VisualWebPart en 2010 de Visual Studio.

En el controlador OnSubmitClick del elemento Web, tiene que proporcionar lógica para leer los informes que se han cargado a la biblioteca de documentos, generar un documento de OpenXML vacío y la combinación de los informes en el nuevo documento.

En primer lugar, deberá leer los documentos en la biblioteca actual. Puede recorrer el SPListItemCollection de la actual SPContext, leer cada archivo en una matriz de bytes que se utiliza la API de SPFile.OpenBinary:

 

SPListItemCollection files = SPContext.Current.List.Items;
  foreach (SPListItem item in files) {
    SPFile inputFile = item.File;
    byte[] byteArray = 
      inputFile.OpenBinary();

    // process each byte array 
  }

A continuación, generar el documento OpenXML vacío. Para ello, generar el documento en la memoria utilizando un MemoryStream debido a que el SDK de OpenXML no le permite guardar documentos en un identificador URI. En su lugar, el objeto de MemoryStream puede volcar el documento en la biblioteca como un archivo nuevo. Se muestra el código para crear el archivo en de figura 6.

La figura 6 de crear un nuevo archivo para el informe combinado

// String containing the blank document part for our new DOCX
string strEmptyMainPart = 
  "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" +
  "<w:document xmlns:w='https://schemas.openxmlformats.org/wordprocessingml/2006/main'>" +
  "<w:body><w:p><w:r><w:t></w:t></w:r></w:p></w:body></w:document>";

// In-memory stream for our consolidated DOCX.
MemoryStream memOut = new MemoryStream();

// Output document's OpenXML object
WordprocessingDocument outputDoc = 
  WordprocessingDocument.Create(memOut, 
  DocumentFormat.OpenXml.WordprocessingDocumentType.Document);

MainDocumentPart mainPart = outputDoc.AddMainDocumentPart();

Stream partStream = mainPart.GetStream();
UTF8Encoding encoder = new UTF8Encoding();

// Add blank main part string to the newly created document
Byte[] buffer = encoder.GetBytes(strEmptyMainPart);
partStream.Write(buffer, 0, buffer.Length);

// Save the document in memory
mainPart.Document.Save();

Tenga en cuenta que debe agregar DocumentFormat.OpenXml.dll y WindowsBase.dll en las referencias y la correspondiente mediante las instrucciones para el código:

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

El siguiente paso es implementar la lógica para guardar el documento combinado a la biblioteca como un documento nuevo. Esto requiere un poco de esfuerzo, pero se puede hacer más fácil mediante el uso del modelo de objetos administrados de cliente de SharePoint. Debe agregar dos referencias al proyecto, Microsoft.SharePoint.Client.dll y Microsoft.SharePoint.Client.Runtime.dll, que se encuentran en la carpeta siguiente:

%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI

Crear un nuevo documento en la biblioteca de SharePoint con este código:

ClientContext clientContext = 
  new ClientContext(SPContext.Current.Site.Url);
ClientOM.File.SaveBinaryDirect(clientContext, 
  outputPath, memOut, true);

Para que estas instrucciones trabajar, necesitará las siguientes instrucciones using en el archivo de origen:

using Microsoft.SharePoint.Client;
using ClientOM = Microsoft.SharePoint.Client;

Hacer que el documento que se pueden buscar

En este momento tienes la lógica en su lugar, para generar documentos consolidados totalmente funcionales en el servidor cuando un usuario hace clic en el botón Combinar informes.

Sin embargo, no hay catch de una pequeña: el documento generado no es compatible con el mecanismo de rastreo de SharePoint ya que contiene el marcado de altChunk OpenXML. Esto es consecuencia de la combinación de los informes en el documento en blanco con el código que le mostramos anteriormente. Cuando se abre un documento de Word, se reemplazan los altChunks con el contenido original.

Con los servicios de automatización de Word nuevo en 2010 de SharePoint, se puede realizar esta tarea mediante programación utilizando la clase ConversionJob. Esta clase forma parte del ensamblado Microsoft.Office.Word.Server.dll, por lo tanto, agregue la referencia a este ensamblado para el proyecto manualmente. Después de agregar esta referencia, puede utilizar el código en del 7 de la figura para realizar la conversión de la altChunks.

La figura 7 de altChunks de realizar la conversión en el documento combinado

string docPath = string.Format(@"{0}{1}", 
  SPContext.Current.Site.Url.Replace(@"\\", ""), 
  outputPath);
            
ConversionJobSettings JobSettings = 
  new ConversionJobSettings();
JobSettings.OutputFormat = SaveFormat.Document;
JobSettings.OutputSaveBehavior = 
  SaveBehavior.AlwaysOverwrite;

ConversionJob ConvJob = new ConversionJob(
  "Word Automation Services", JobSettings);
ConvJob.UserToken = SPContext.Current.Site.UserToken;
ConvJob.AddFile(docPath, docPath);
ConvJob.Start();

Vea el código de descarga de este artículo para obtener más detalles de la solución, que puede utilizar como base de su propio sistema de informes.

Pasos finales

Para probar este código, se modifica la configuración de nuestro servidor SharePoint para ejecutar el servicio de automatización después de un minuto de la obtención de una solicitud de ejecución.De forma predeterminada, este intervalo se establece en 5 minutos y no desea esperar a que para la conversión a ocurrir.

Si desea cambiar esta configuración, se puede establecer en la administración central de SharePoint en administración de aplicaciones | administrar aplicaciones de servicios | servicios de automatización de Word y la frecuencia de conjunto para iniciar las conversiones de bajo rendimiento de la conversión a un minuto.

El último informe generado contiene todos los informes de estado semanal que ha creado, se combinan en un solo documento nuevo con cada uno de los 
individual informes apilan uno tras otro.

Y eso es todo.En un próximo artículo tomaremos el concepto de combinación de servidor de contenido del documento al siguiente nivel.Le mostraremos cómo implementar un tipo de combinación de correspondencia de escenario en el servidor, vuelva a utilizar Office 2010, 2010 de SharePoint y Visual Studio de 2010.Hasta luego, feliz programación.

Para obtener más información sobre Office 2010 y 2010 de SharePoint, vea el de Office de y centros de desarrolladores en SharePoint.Puede encontrar información acerca de Office OpenXML en msdn.microsoft.com/library/bb448854de , y puede obtener información acerca de los servicios de automatización de Word en msdn.microsoft.com/library/ee558278(v=office.14) de .

Manvir SinghyAnkush Bhatiaforman parte de Visual Studio Developer Support Team en Microsoft técnico soporte técnico (PSS), permiten a los clientes sobre la programación de problemas relacionados con las aplicaciones de cliente de Office.Se puede llegar a Singh en manvir.singh@microsoft.com de o manvirsingh.net de .Se puede llegar a Bhatia en ankush.bhatia@microsoft.com de o <abhatia.wordpress.com> de .

Gracias al siguiente experto técnico para este artículo: Eric White