我希望能够在Sharepoint中存储模板word文档,并将其用作吐出包含注入模板的数据的word doc的基础。
我可以使用以下代码获取我的单词doc的文本:
SPSite sc = SPContext.Current.Site;
SPWeb web = sc.AllWebs["MySite"];
string contents = web.GetFileAsString("Documents/MyTemplateWord.doc");
web.Dispose();
然后我可以在“contents”变量上进行字符串替换。这很好。
我现在想把这个新内容“打开”为word 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();
我收到了一个错误,但不确定如何解决它。
错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。详细信息:在'ࡱ>附近解析时出错
现在显然它解析了“字符串”内容。
我做错了什么?我应该采取不同的方式吗?
答案 0 :(得分: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互操作可能是一个时间的吸血鬼。
答案 1 :(得分:0)
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);
}