2011-11-28 129 views
2

我希望能夠在Sharepoint中存儲模板word文檔,並將其用作吐出包含注入到模板中的數據的word文檔的基礎。從sharepoint打開word文檔,替換文本和流到用戶

我可以使用代碼如下得到我的Word文檔的文本:

SPSite sc = SPContext.Current.Site; 
    SPWeb web = sc.AllWebs["MySite"];    

    string contents = web.GetFileAsString("Documents/MyTemplateWord.doc"); 

    web.Dispose(); 

然後,我可以串在「內容」變量替換。這工作正常。

我現在想「打開」這個新的內容作爲word文檔。

我給這家代碼如下:

string attachment = "attachment; filename=MyWord.doc"; 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ClearHeaders(); 
    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
    HttpContext.Current.Response.ContentType = "text/ms-word"; 
    HttpContext.Current.Response.Write(outputText); 
    HttpContext.Current.Response.End(); 

我得到一個錯誤,雖然,不知道如何解決它。

錯誤:Sys.WebForms.PageRequestManagerParserErrorException:無法解析從服務器收到的消息。此錯誤的常見原因是,通過調用Response.Write(),響應篩選器,HttpModules或服務器跟蹤已啓用來修改響應時。詳細信息:錯誤解析'ࡱ>

現在很明顯,它有解析「字符串」內容的問題。

我在做什麼錯?有沒有不同的方式我應該這樣做?

回答

1

您不讀取字符串,而是將二進制數據轉換爲字符串。 (請注意,docx是包含xml數據的zip文件)。 您在這方面的替換文本方法的性質是有缺陷的。

如果不是因爲要查找/替換文本的願望,我會建議

using(SPWeb web = new SPSite("<Site URL>").OpenWeb()) 
{ 
    SPFile file = web.GetFile("<URL for the file>"); 
    byte[] content = file.OpenBinary(); 
    HttpContext.Current.Response.Write(content); 
} 

http://support.microsoft.com/kb/929265 使用的BinaryWrite將數據獲取到您的網頁。

但是,由於您使用的是Word,我建議將文檔加載到Microsoft.Office.Interop.Word objects的實例中。 但是,使用Word interop可能會有點時間吸血鬼。

0

1-加載DOCX組件使用Novacode您shaepoint包https://docx.codeplex.com

2-;

3-注意以下樣本下載按鈕

protected void ButtonExportToWord_Click(object sender, EventArgs e) 
     { 
      byte[] bytesInStream; 

      using (Stream tplStream = 
       SPContext.Current.Web.GetFile("/sitename/SiteAssets/word_TEMPLATE.docx").OpenBinaryStream()) 
      { 
       using (MemoryStream ms = new MemoryStream((int)tplStream.Length)) 
       { 
        CopyStream(tplStream, ms); 
        ms.Position = 0L; 

        DocX doc = DocX.Load(ms); 
        ReplaceTextProxy(doc,"#INC#", "11111111"); 

        doc.InsertParagraph("This is my test paragraph"); 

        doc.Save(); 
        bytesInStream = ms.ToArray(); 
       } 
      } 

      Page.Response.Clear(); 
      Page.Response.AddHeader("Content-Disposition", "attachment; filename=" + 
       CurrentFormId + ".docx"); 
      Page.Response.AddHeader("Content-Length", bytesInStream.ToString()); 
      Page.Response.ContentType = "Application/msword"; 
      Page.Response.BinaryWrite(bytesInStream); 

      Page.Response.Flush(); 
      Page.Response.Close(); 
      //Page.Response.End();// it throws an error 
     } 

     private void ReplaceTextProxy(DocX doc, string oldvalue, string newValue) 
     { 
      doc.ReplaceText(oldvalue,newValue,false, RegexOptions.None, null, null, 
         MatchFormattingOptions.SubsetMatch); 
     }