การเปิดเอกสารคำจาก sharepoint แทนที่ข้อความและสตรีมไปยังผู้ใช้

ฉันต้องการที่จะจัดเก็บเอกสารคำเทมเพลตใน Sharepoint และใช้เป็นฐานในการแยกเอกสารคำที่มีข้อมูลที่แทรกเข้าไปในเทมเพลต

ฉันสามารถรับข้อความ word doc ของฉันได้โดยใช้โค้ดดังนี้:

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

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

    web.Dispose(); 

จากนั้นฉันสามารถแทนที่สตริงในตัวแปร "เนื้อหา" ได้ มันใช้งานได้ดี

ตอนนี้ฉันต้องการ "เปิด" เนื้อหาใหม่นี้เป็นเอกสารคำ

รหัสของฉันสำหรับสิ่งนี้เป็นดังนี้:

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 หรือการติดตามเซิร์ฟเวอร์ถูกเปิดใช้งาน รายละเอียด: เกิดข้อผิดพลาดในการแยกวิเคราะห์ใกล้กับ 'ࡱ>

ตอนนี้เห็นได้ชัดว่ามีปัญหาในการแยกวิเคราะห์เนื้อหา "สตริง"

ผมทำอะไรผิดหรือเปล่า? มีวิธีอื่นที่ฉันควรทำสิ่งนี้หรือไม่?


person ozz    schedule 28.11.2011    source แหล่งที่มา


คำตอบ (2)


คุณไม่ได้อ่านสตริง คุณกำลังแปลงข้อมูลไบนารีเป็นสตริง (โปรดจำไว้ว่า 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 interop อาจเป็นเรื่องที่ยุ่งยากสักหน่อย

person Nat    schedule 28.11.2011

1- เพิ่มชุดประกอบ docx ลงในแพ็คเกจ 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);
        }
person Iman    schedule 31.03.2014