Открытие слова документа из sharepoint, замена текста и потока для пользователя - PullRequest
2 голосов
/ 28 ноября 2011

Я хочу иметь возможность хранить документ шаблона слова в Sharepoint и использовать его в качестве основы для размещения документа документа, содержащего данные, введенные в шаблон.

Я могу получить текст своего словаДок, используя код следующим образом:

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

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

    web.Dispose(); 

Затем я могу заменить строку в переменной "contents".Это прекрасно работает.

Теперь я хочу «открыть» этот новый контент как слово doc.

Мой код для этого выглядит следующим образом:

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

I 'Однако я получаю сообщение об ошибке и не знаю, как ее устранить.

Ошибка: Sys.WebForms.PageRequestManagerParserErrorException: сообщение, полученное с сервера, не может быть проанализировано.Распространенными причинами этой ошибки являются изменения ответа путем вызова Response.Write (), фильтров ответа, HttpModules или трассировки сервера.Подробности: Ошибка разбора рядом с 'ࡱ>

Теперь очевидно, что есть проблемы с синтаксическим анализом содержимого "string".

Что я делаю не так?Есть ли другой способ, которым я должен делать это?

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Вы не читаете строку, вы конвертируете двоичные данные в строку. (Помните, что docx - это zip-файл, содержащий данные XML). Характер вашего подхода к замене текста в этом отношении несовершенен.

Если бы не желание найти / заменить текст, я бы порекомендовал

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 . Тем не менее, использование взаимодействия Word может быть немного временным вампиром.

0 голосов
/ 31 марта 2014

1 - добавить сборку docx в ваш пакет shaepoint https://docx.codeplex.com

2 - с использованием Novacode;

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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...