Este artigo foi traduzido por máquina.

Serviços do Office

Mesclando documentos do Word no lado do servidor com o SharePoint 2010

Ankush Bhatia

Baixe o código de exemplo

Os desenvolvedores de aplicativos de negócios muitas vezes devem criar soluções que automatizam tarefas diárias de suas organizações. Essas atividades normalmente envolvem o processamento e manipulação de dados em vários documentos — por exemplo, extraindo e consolidando dados de vários documentos de origem, mesclar os dados em mensagens de email, pesquisando e substituindo o conteúdo de documentos, recalculando dados nas pastas de trabalho, extraindo as imagens de apresentações... e a lista continua em e em.

Microsoft Office facilita esses tipos de tarefas repetitivas, fornecendo uma API avançada, os desenvolvedores podem usar para automatizá-las. Como dessas soluções funcionarem perfeitamente para usuários da área de trabalho normais, os desenvolvedores tiveram-los para o próximo nível: Implantando as soluções em servidores que fornecem um ponto central onde todo esse trabalho repetitivo pode ser resolvido para vários usuários, sem qualquer intervenção humana.

Apesar de parece simples mover soluções concluir tarefas repetitivas do Office na área de trabalho para um servidor, não é tão simples quanto parece.

A Microsoft projetou o conjunto de aplicativos do Office para o computador de mesa cenários onde um usuário esteja conectado a um computador e está sentado na frente dele. Por motivos de segurança, desempenho e confiabilidade, aplicativos do Office não são as ferramentas certas para cenários de servidor. Aplicativos do Office em um ambiente de servidor podem exigir intervenção manual e não é ideal para uma solução do lado do servidor. A Microsoft recomenda como evitar esse tipo de solução, conforme explicado no artigo de suporte da Microsoft, “ Considerações para automação do lado do servidor do Office ”.

Desde o lançamento do Office 2007, no entanto, a história de automação do Office mudou muito. Com o Office 2007 Microsoft apresentou o OpenXML do Office e os serviços do Excel para os desenvolvedores que queiram desenvolver soluções baseadas no Office no servidor.

Com o Office 2010 e 2010 do SharePoint, Microsoft chegou com um novo conjunto de componentes chamados de serviços de aplicativos. Esses colocar um rico conjunto de ferramentas no conjunto de propriedades de um desenvolvedor de soluções de automação do Office. Os serviços de aplicativos incluem os serviços do Excel, serviços de automação do Word, o InfoPath Forms Services, serviços do PerformancePoint e dos serviços do Visio. Você pode saber mais sobre os detalhes desses serviços em msdn.microsoft.com/library/ee559367(v=office.14) de .

Neste artigo, mostraremos a você como usar o Office OpenXML, serviços de automação do Word e do SharePoint para criar um aplicativo simples que mescle os relatórios de status separado em um único documento.

Fluxo de trabalho de relatório de status

Let’s, digamos que você é um desenvolvedor que trabalha em uma empresa e orientada a serviços em que muitos projetos são gerenciados por equipes diferentes. Toda semana, cada gerente de projeto usa um modelo comum de criar um relatório semanal de status e carregá-lo em um repositório interno do SharePoint. Agora, o Gerenciador de grupo deseja obter um relatório consolidado que conterá todos esses recursos de relatórios de status semanais e, adivinhe, você é escolhido aquele que tem para implementar esse requisito.

Tiver sorte, no entanto. Como mencionamos anteriormente, sua vida é atualmente mais fácil porque você pode implementar esse requisito com muito menos esforço usando o OpenXML e dos serviços de automação do Word. Você será capaz de produzir uma solução mais robusta e estável que você poderia ter sem essas tecnologias.

Let’s começar a visualizando-se a solução. A Figura 1 mostra um fluxo de trabalho proposto. O processo ativa com os gerentes de projeto individuais, preenchendo relatórios de status e carregá-las para o SharePoint no servidor. O gerente de grupo, em seguida, pode iniciar o processo de mesclagem de todos os relatórios armazenados no servidor e gerando um relatório combinado.

Figure 1 Workflow for Generating a Status Report

Figura 1 de fluxo de trabalho para gerar um status de relatório

Criando um modelo

Para implementar essa solução, a primeira etapa é fornecer um modelo comum a todos os gerentes de projeto para preencher os relatórios de status semanal. Quando eles terminarem de preencher os dados, irá carregar os relatórios de um repositório do SharePoint. Na manhã de segunda-feira, o gerente de grupo pode efetuar logon no site do SharePoint e acionar a lógica que executa as seguintes tarefas:

  1. Lê todos o status individual documentos de relatório.
  2. Mescla-los em um único relatório.
  3. Salva o relatório no repositório para que os usuários de acesso.

A Figura 2 mostra o modelo de relatório de status como ficará (let’s chamá-lo WeeklyStatusReport.dotx). Como você pode ver, o modelo inclui campos para capturar um título, datas, nome do gerente de projeto, etapas do projeto e dados associados e campos de texto para inserir detalhes sobre as realizações, os planos futuros e problemas. Nesse caso usamos os campos de texto e o controle de selecionador de data para manter a simplicidade, mas você pode usar facilmente listas suspensas, caixas de seleção ou uma variedade de outros controles para simplificar a entrada de dados.

Figure 2 Weekly Status Report Template

A Figura 2 do modelo de relatório de status semanal

A biblioteca de documentos

A próxima etapa é criar uma biblioteca de documentos personalizada que hospeda os relatórios de status semanal com base neste modelo.

No painel de navegação do SharePoint, clique em bibliotecas e, em seguida, criar para criar uma nova biblioteca. Na caixa de diálogo Criar, filtre por biblioteca, selecione a biblioteca de documentos e digite um nome para a biblioteca (nós usamos o WSR Library). Agora, clique em criar.

Agora você precisa criar um tipo de conteúdo para a nova biblioteca. Clique em ações de site, as configurações do site e, na seção galerias de, clique em tipos de conteúdo do site. Clique em criar e, em seguida, digite um nome para o tipo de conteúdo (usamos relatório semanal de status).

Na lista Selecionar pai Content Type em, selecione os tipos de conteúdo de documento. Na lista Tipo de conteúdo do pai, selecione o documento e clique em OK.

Em configurações, selecione configurações avançadas, e em seguida, escolha o botão de opção “ carregar um novo modelo de documento ” e clique em Procurar. Localize o modelo de relatório (WeeklyStatusReport.dotx) e carregue-o para a biblioteca.

Em seguida, vá para o WSR Library e selecionar definições da biblioteca. Em General Settings, selecione configurações avançadas. Selecione Sim para “ permitir o gerenciamento de tipos de conteúdo ”, e em seguida, clique em OK.

Você verá uma lista dos tipos de conteúdo exibido na página de configuração da biblioteca. Selecione o link “ Adicionar de Existing Site tipos de conteúdo ”. Selecione o tipo de conteúdo que você criou anteriormente na lista de tipos de conteúdo do site disponível. No meu exemplo, este é o relatório de status semanal. Clique em Adicionar e clique em OK.

Novamente na lista de tipos de conteúdo, clique no documento e selecione “ Excluir este tipo de conteúdo ”. Clique em OK na caixa de mensagem de aviso.

Agora você deve ver o tipo de conteúdo quando você seleciona um novo documento na biblioteca de WSR, conforme mostrado no do Figura 3.

Figure 3 Selecting the Custom Content Type
A Figura 3 de Selecionar o tipo de conteúdo personalizados

Neste ponto, você pode ir em frente e adicione alguns relatórios de status para a biblioteca de documentos.

Criando a Web Part

Em seguida, você precisa permitir que um gerente de grupo para disparar a lógica de consolidação. Você pode fazer isso por meio de um botão na parte inferior do modo de exibição padrão da biblioteca de documentos.

Há duas etapas envolvidas aqui. Em primeiro lugar, você criará uma Web Part Visual usando o Visual Studio 2010. Em segundo lugar, você adicionará a Web Part para a biblioteca de documentos usando o SharePoint Designer 2010.

Para criar uma Web Part personalizada, inicie um novo projeto no Visual Studio 2010 usando o modelo de projeto do Visual Web Part. Nomeie o projeto como DocumentMerge, e em seguida, clique em OK.

Na página do Assistente para personalização do SharePoint, selecione o seu aplicativo da Web (URL do site do SharePoint que hospeda a sua biblioteca de documentos), e em seguida, clique em ' Concluir '.

Depois que o projeto é criado, abra o arquivo VisualWebPart1.cs e modifique o método CreateChildControls com o código a seguir:

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);
}

Além disso, adicione um manipulador para o clique de botão:

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

Neste ponto, você pode criar e implantar o seu projeto. Adicionaremos a implementação do nosso manipulador OnSubmitClick um pouco mais adiante neste artigo.

A próxima etapa é adicionar a Web Part para a biblioteca de documentos. Em 2010 do SharePoint Designer, abra o site do SharePoint. Clique em todos os arquivos | biblioteca WSR | Forms, em seguida, clique em AllItems. aspx para editá-lo.

Clique no final da página. Clique em Inserir | Web Part e, em seguida, selecione mais Web Parts. Na caixa de pesquisa, digite VisualWebPart (o nome da Web Part recém-criado e implantado) e clique em OK (consulte do Figura 4). A Figura 5 mostra a página com a Web Part no lugar. Salve a página e feche o SharePoint Designer.

Figure 4 Inserting the Web Part

Figura 4 de Inserir a Web Part

Figure 5 The Web Part in Place on the Page

Da Web Part no local na página, a Figura 5

Mesclar os relatórios

Agora, adicione let’s a lógica para mesclar documentos carregados na biblioteca de documentos. Para manter a simplicidade, este código irá mesclar todos os documentos carregados nesta pasta em um único arquivo. Uma abordagem mais realista seria mesclar apenas os itens selecionados ou somente itens carregados em um período de tempo especificado. Você também pode salvar o documento mesclado a um local diferente ou biblioteca diferente. É aí, adicionaremos a implementação do nosso manipulador OnSubmitClick do nosso projeto VisualWebPart no Visual Studio 2010.

No manipulador OnSubmitClick da Web Part, você precisa fornecer lógica para ler os relatórios que foram carregados na biblioteca de documentos, gerando um documento OpenXML vazio e mesclar os relatórios em um novo documento.

Em primeiro lugar, você precisa ler qualquer documento na biblioteca atual. Você pode fazer loop através de SPListItemCollection do SPContext atual, lendo cada arquivo em uma matriz de bytes usando a API 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 
  }

Em seguida, gere o documento OpenXML vazio. Isso requer a gerar o documento na memória usando um MemoryStream porque o OpenXML SDK não permite que você salvar os documentos para um URI. Em vez disso, o objeto MemoryStream despeje o documento na biblioteca como um novo arquivo. O código para criar o arquivo é mostrado no do Figura 6.

Figura 6 de criar um novo arquivo para o relatório mesclado

// 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();

Observe que você precise adicionar DocumentFormat.OpenXml.dll e WindowsBase. dll em referências e o correspondente usando instruções ao código:

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

A próxima etapa é implementar a lógica para salvar o documento mesclado à biblioteca como um novo documento. Isso requer um pouco de esforço, mas você pode tornar mais fácil usando o modelo de objeto do SharePoint Managed Client. Você precisará adicionar duas referências ao projeto, Microsoft.SharePoint.Client.dll e Microsoft.SharePoint.Client.Runtime.dll, são encontradas na seguinte pasta:

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

Crie um novo documento na biblioteca do SharePoint com este código:

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

Para estas instruções para funcionar, você terá as seguintes instruções using no arquivo de origem:

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

Fazer com que o documento pesquisável

Neste ponto, você tem a lógica de in-loco para gerar totalmente funcionais documentos consolidados no servidor quando um usuário clica no botão de relatórios de mala direta.

No entanto, é um detalhe pequeno: o documento gerado não é compatível com o mecanismo de rastreamento do SharePoint porque ele contém a marcação de altChunk OpenXML. Este é um subproduto de mesclar os relatórios para o documento em branco usando o código que mostramos anteriormente. Os altChunks são substituídos pelos conteúdo original quando um documento é aberto no Word.

Com os serviços de automação de novo o Word em SharePoint 2010, essa tarefa pode ser executada por meio de programação usando a classe ConversionJob. Essa classe é parte do assembly Microsoft.Office.Word.Server.dll, portanto, adicione a referência a este assembly ao projeto manualmente. Depois de adicionar essa referência, você pode usar o código no do Figura 7 para realizar a conversão do altChunks.

A Figura 7 do altChunks convertendo no documento mesclado

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();

Consulte o código para download deste artigo para obter detalhes adicionais da solução, você pode usar como base para seu próprio sistema de relatórios.

Etapas finais

Para testar esse código, modificamos a configuração do nosso servidor do SharePoint para executar o serviço de automação após um minuto de receber uma solicitação de execução.Por padrão, esse intervalo é definido para cinco minutos, e não quiséssemos esperar que tempo para que nossa conversão aconteça.

Se você gostaria de alterar essa configuração, você pode defini-la na Administração Central do SharePoint em gerenciamento de aplicativos | gerenciar aplicativos de serviço | serviços de automação do Word e definir a freqüência para iniciar as conversões em conversão de taxa de transferência para um minuto.

O relatório gerado final contém todos os relatórios de status semanais que você criou, mescladas em um único documento novo com cada um a 
individual relatórios empilhados um após o outro.

E isso é tudo.Um artigo futuro, daremos o conceito do lado do servidor a mesclagem de conteúdo do documento para o próximo nível.Mostraremos como implementar um tipo de recurso de mala direta do cenário do lado do servidor, usando novamente o Office 2010, 2010 do SharePoint e Visual Studio 2010.Até então, feliz de codificação.

Para obter mais informações sobre o Office 2010 e 2010 do SharePoint, consulte o Office de e SharePoint de developer centers.Informações sobre OpenXML do Office podem ser encontradas em msdn.microsoft.com/library/bb448854de e você pode ler sobre os serviços de automação do Word no msdn.microsoft.com/library/ee558278(v=office.14) de .

Manvir SingheAnkush Bhatiafazem parte do Visual Studio Developer Support Team na Microsoft atendimento (PSS), ajudando-os clientes sobre problemas que envolvem aplicativos cliente do Office de programação.Você pode acessar Singh manvir.singh@microsoft.com de ou de manvirsingh.net .Você pode acessar Bhatia de ankush.bhatia@microsoft.com ou de <abhatia.wordpress.com> .

Meus agradecimentos aos seguinte especialista técnico para revisar este artigo: Eric White