本文章是由機器翻譯。

Office 服務

使用 SharePoint 2010 合併伺服器端上的 Word 文件

Ankush Bhatia

下載程式碼範例

商務應用程式開發人員通常必須建立自動化為自己的組織的日常活動的解決方案。這些活動,通常涉及的處理和管理不同的文件中的資料),就例如擷取和合併彙算資料,從多個來源文件,合併到電子郵件訊息的資料、 搜尋和取代內容重新計算資料擷取影像從簡報的活頁簿中的文件中...及清單會與上。

Microsoft Office 會將藉由提供豐富的 API,開發人員可以用來將它們自動化的這類的重複性的工作更簡單。因為這類解決方案不著痕跡地用於一般桌上型電腦的使用者,開發人員有採取它們到下個層級:將方案部署至提供可以解決所有這個重複性工作的中心點為多個使用者,不需要人為介入的伺服器中。

雖然移動完成重複從桌上型電腦到伺服器的 Office 工作的方案似乎很簡單,’s 不很像簡單聽起來。

Microsoft 所設計桌上電腦案例使用者登入到電腦,並在它的前面坐在 Office 應用程式的套件。安全性、 效能和可靠性的原因 Office 應用程式不是伺服器端案例中適當的工具。Office 應用程式,在伺服器環境中的,可能需要手動介入的情況下,所不 ’s 伺服器端解決方案的最佳。Microsoft 建議避免這種方案,如 Microsoft 支援文件 「 的伺服器端自動化 Office 的考量 」 中所述。

自發行的 Office 2007,不過,Office 自動化本文已變更許多。與 Office 2007 Microsoft 導入 Office OpenXML 和開發人員想要開發伺服器上的 Office 解決方案的 Excel 服務。

與 Office 2010] 和 [SharePoint 2010 Microsoft 已經變成與一組新的呼叫應用程式服務的元件。這些 Office 自動化解決方案的開發人員 ’s 包置於一組豐富的工具。應用程式服務包括 Excel 服務 」、 「 Word 自動化服務 」、 「 InfoPath Forms Services 」、 「 PerformancePoint 服務及 「 Visio 服務。您可以了解更多關於這些服務在 msdn.microsoft.com/library/ee559367(v=office.14) 的詳細資料。

這個本文我們將告訴您如何使用 Office OpenXML]、 [Word 自動化服務] 及 [SharePoint 建置一個簡單的應用程式,將不同的狀態報表合併到一份文件。

狀態報表工作流程

let’s 說 ’re 工作在服務導向的公司,由不同團隊管理許多專案的開發人員。每個的一週每個專案經理使用常見的範本來建立每星期的狀態報表,並將它上載到內部的 SharePoint 儲存機制。現在您的群組管理員想要取得合併的報表,包含所有這些每週的狀態報表然後,知道,您是選擇已實施此需求的人。

您 ’re 很幸運,不過。如我們先前所述,您的生活是今天更為容易,因為實作這項需求,有許多滾動使用 OpenXML 和 Word 自動化服務。您可以產生更穩定且穩定解決方案比可能沒有這些技術。

let’s 開始視覺化解決方案。圖 1 顯示建議的工作流程。與個別專案經理填寫狀態報表,並在伺服器上將它們上載到 SharePoint,介入處理程序。群組管理員可以再啟動合併儲存在伺服器上任何報表的程序,並產生合併的報表。

圖 1 的產生一個狀態的工作流程報告

建立一個範本

若要實作此解決方案,第一步就是提供給所有專案經理的通用範本,填寫每星期的狀態報表。當他們完成填入資料時,它們上載到 SharePoint 儲存機制的報表。在星期一的上午群組管理員可以再登入到 SharePoint 網站和引發向上會執行下列工作的邏輯:

  1. 讀取所有個別的狀態報告文件。
  2. 將它們合併成單一的報表。
  3. 儲存報告,讓使用者存取儲存機制中。

圖 2 顯示何種狀態報表範本將外觀 (let’s 呼叫它 WeeklyStatusReport.dotx)。您可以看到 [範本會包含擷取標題、 日期、 專案經理 ’s 名稱、 里程碑以及關聯的資料欄位] 及 [文字欄位輸入 accomplishments、 未來的計劃與問題有關的詳細資料。在這種情況下我們使用文字欄位] 和 [日期選擇器控制項為求,但您可以輕鬆地使用下拉式清單、 核取方塊或各種其他控制項來簡化資料的輸入。

圖 2 的 每週的狀態報表範本

文件庫

下一個步驟是建立裝載每星期的狀態報表依據此範本的自訂文件庫。

在 SharePoint] 瀏覽窗格中按一下 [程式庫],然後按一下 [建立],建立新的文件庫]。建立] 對話方塊中篩選出的文件庫、 選取文件庫,並鍵入文件庫 (我們使用 WSR 程式庫) 的名稱。現在,請按一下 [建立]。

現在您必須建立新的文件庫的內容類型。按一下網站的動作,然後站台設定,和藝廊] 區段下,按一下 [站台的內容類型。按一下 [建立],然後鍵入的內容 (我們會使用每週的狀態報表) 的型別名稱。

選取父系內容類型從] 清單中選取 [文件內容類型]。[父系內容類型] 清單中選取 [文件],然後按一下 [確定]。

在 [設定],選取進階設定值然後選擇 「 上載新的文件範本 」] 選項按鈕,並按一下 [瀏覽]。尋找報表範本 (WeeklyStatusReport.dotx),並將它上載到文件庫]。

接下來,移到 WSR 程式庫,然後選取 [文件庫設定]。在一般的設定] 下選取 [進階設定]。「 允許管理內容的型別 」,請選取 [是],然後按一下 [確定]。

您查看顯示在文件庫的 [設定] 頁面上的內容類型的清單。選取 「 新增從現有網站內容類型 」 連結。選取您先前在可用的網站的 [內容類型] 清單中建立的內容類型。在我的範例中,這是每週的狀態報表。按一下 [新增],並按 [確定]。

一次從 [內容類型] 清單文件上按一下,並選取 「 刪除這個內容型別 」。警告訊息方塊中,選取 [確定]。

現在您應該會看到您的內容類型時選取 [新文件] 在您的 WSR 櫃 的 圖 3 所示。


圖 3 選取自訂內容類型

此時您可以請繼續進行,並新增至文件庫的數個狀態報表。

建立 [網頁組件

接下來,您必須啟用開始進行彙總邏輯的群組管理員。透過在文件庫的預設檢視底端的按鈕,您可以執行這項操作。

有兩個步驟牽涉到這裡。首先,您建立 Visual Web 組件使用 Visual Studio 2010。第二,將 [網頁組件新增到文件庫使用 SharePoint 設計工具 2010年。

若要建立自訂的 Web 組件,請使用 Visual Web 組件專案範本的 Visual Studio 2010 中開始新的專案。為專案指定的名稱,例如 DocumentMerge,然後按一下 [確定]。

在 SharePoint 自訂精靈] 頁面中選取您的 Web 應用程式 (主控文件庫的 SharePoint 網站 URL),],然後按一下 [完成]。

專案建立之後開啟 VisualWebPart1.cs 檔案,並修改 CreateChildControls 方法,下列程式碼:

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

也加入的按鈕的 Click 事件處理常式:

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

現在您可以建置並部署您的專案。我們將會加入有點稍後在本文中我們 OnSubmitClick 處理常式實作。

下一個步驟是將 [網頁組件新增到文件庫。在 SharePoint 設計工具 2010,開啟 [SharePoint 網站]。按一下 [所有檔案 | WSR 程式庫 | 表單,然後都按一下 AllItems.aspx 來編輯它。

按一下頁面底端。按一下 [插入] | Web 組件] 及再選取其他網頁組件。在 [搜尋] 方塊中,鍵入 VisualWebPart (剛剛建立並部署的目的網頁組件名稱),並按 [確定] (請參閱 的 圖 4)。圖 5 會顯示與 [網頁組件頁面中的位置。儲存網頁,然後關閉 SharePoint 設計工具。

圖 4 插入網頁組件

圖 5 的 「 網頁組件,在頁面上的位置

合併報告

現在,let’s 新增要上載的文件,在文件庫中的合併邏輯。為了簡單起見,這段程式碼將會合併成單一檔案上載到這個資料夾的所有文件。更實際可行的方法就是合併選取項目] 或 [只在指定的時間內上載的項目。您也能將合併的文件儲存到不同的位置或不同的程式庫。這是當我們加入我們的 OnSubmitClick 處理常式,在 Visual Studio 2010 我們 VisualWebPart 專案的實作。

在 [網頁組件的 [OnSubmitClick] 處理,您需要提供邏輯讀取已上載到文件庫的報表]、 [產生空的 OpenXML 文件,] 和 [合併到新文件的報表。

首先,您需要讀取目前的文件庫中的任何文件。您可以執行的目前 SPContext,每一檔案讀入位元組陣列,您可以使用 SPFile.OpenBinary API SPListItemCollection 迴圈:

 

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

    // process each byte array 
  }

接下來,產生空的 OpenXML 文件。這需要產生使用一個 MemoryStream,因為 OpenXML SDK 不能讓您將文件儲存至 URI 的記憶體中的文件。而是,MemoryStream 物件可以傾文件印到文件庫,為新的檔案。的 [圖 6] 顯示建立檔案的程式碼。

圖 6 建立新的合併的報表檔案

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

請注意您需要將 DocumentFormat.OpenXml.dll] 和 [WindowsBase.dll 新增參考,並使用程式碼陳述式的對應:

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

下一個步驟,就是實作邏輯合併的文件儲存為新的文件庫。 這需要的投入量的位元,但是您可以讓它更容易使用 SharePoint 管理用戶端物件模型。 您需要加入 Microsoft.SharePoint.Client.dll] 和 [Microsoft.SharePoint.Client.Runtime.dll,在下列資料夾中找到兩個的專案參考:

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

在 SharePoint 程式庫,此程式碼中,建立新的文件:

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

若要使用這些指令,您需要下列使用原始程式檔中的陳述式:

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

建立可搜尋的文件

現在您有邏輯中產生功能完整的合併文件,在伺服器上,當使用者按一下合併的報表按鈕的地方。

但是,’s 一個小型的 catch:產生的文件不是 SharePoint 耙梳機制與相容的因為它包含 OpenXML altChunk 標記。 這是一個 by-product 插入空白的文件使用我們稍早顯示的程式碼合併報告。 在 Word 中開啟文件時,altChunks 取得取代原始的內容。

與 「 新 Word 自動化服務在 SharePoint 2010,可以以程式設計的方式使用 ConversionJob 類別來執行這項工作。 這個類別是 Microsoft.Office.Word.Server.dll 組件的一部分,所以這個組件的參考手動新增至專案。 一旦您加入此參考,您可以在 的 圖 7 中使用程式碼,執行 altChunks 的轉換。

圖 7 的 Converting altChunks 合併文件中

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

查看下載的其他詳細資料的方案為基礎的報告的系統,您可以使用這個文件的程式碼。

最後步驟

若要測試此程式碼,我們修改我們的 SharePoint 伺服器 ’s 取得執行的要求的一分鐘後執行自動化服務的組態。預設情況下,此間隔設為五分鐘的時間,而且我們 didn’t 要等候的長,我們會發生轉換。

如果您要變更這項設定,可以設定在 [應用程式管理 SharePoint 管理中心] 中 | 管理服務應用程式 | Word 自動化服務,並設定 「 頻率開始轉換處理量] 下的 [轉換] 設為一分鐘。

最後產生的報表包含的所有每週狀態報告您建立、 合併為單一的新文件,與每個 
individual 報表堆疊一個接著一個。

這樣就大功告成了。在未來的文章中,我們採取的伺服器端合併到下一層級的文件內容的概念。我們告訴您如何實作的案例的合併列印類型伺服器一邊再次使用 Office 2010、 SharePoint 2010 和 Visual Studio 2010。直到再、 快樂撰寫程式碼。

在 Office 2010 和 SharePoint 2010 的詳細資訊,請參閱 Office 和 SharePoint 開發人員中心。msdn.microsoft.com/library/bb448854 ,在找不到 Office OpenXML 的相關資訊,以及您可以閱讀關於 Word 自動化服務在 msdn.microsoft.com/library/ee558278(v=office.14)

Manvir Singh* 和 Ankush Bhatia 是 Visual Studio 開發人員支援小組在 Microsoft 技術支援部 (PSS),幫助客戶在程式設計問題牽涉到 Office 用戶端應用程式的一部分。您可以在 manvir.singh@microsoft.commanvirsingh.net 到達 Singh。您可以在 ankush.bhatia@microsoft.com 或 <abhatia.wordpress.com> 到達Bhatia。*

多虧了要檢閱這份文件的下列的技術專家:Eric 白色